Я написал быстрое приложение, чтобы понять рамки RenderScript и распознал, что при достижении примерно 65 000 треугольников система просто не рисует никаких дополнительных. Например, если я создаю цилиндр с 70 000 треугольников, из цилиндра будет отсутствовать клин, соответствующий треугольникам, которые превышают отметку ~ 65 000. Треугольники текстурированы и для удобства написания приложения я просто использовал класс TriangleMeshBuilder
, поэтому нет реальной оптимизации, например, с использованием трифанов или триплетов. Аппаратное обеспечение Samsung Galaxy Nexus. LogCat сообщает о размере кучи около 15 МБ с 3% бесплатной. Я не получаю никаких ошибок или предупреждений относительно графической системы или RenderScript.Максимальное количество треугольников в RenderScript
Может ли кто-нибудь объяснить причину падения треугольников? Я на аппаратном лимите, который RenderScript обрабатывает изящно?
ОБНОВЛЕНИЕ Происходит на Samsung Galaxy Nexus (4.0.3), Samsung Galaxy Tab 7.0+ (3.2) и Motorola Xoom (3.2). Все в одной точке примерно 65 000 треугольников. Каждое из этих устройств имеет разные графические процессоры.
ОБНОВЛЕНИЕ 2 В ответ на мысли Стива Блэквелла у меня есть дополнительные мысли.
Линии 710-712 действительно понижают показатели int
до short
, таким образом, 65536 уходит в 0, поскольку Стив указывает. Кроме того, «литье» в строке 757 - это не столько актеры, сколько указание RenderScript на формат двоичных данных, которые в конечном итоге будут отправлены на него. RenderScript требует, чтобы все данные были упакованы в определенный тип данных RenderScript, называемый Allocation
, для перехода от Java к среде выполнения RenderScript, и об этом необходимо сообщить в отношении структуры данных. В соответствии со взглядом Стива, что это ошибка, строка 757 сообщает RenderScript для обработки данных индекса как short
(без знака 16 бит), но он отправляет ему 32-битное знаковое значение (которое будет принято из-за отсутствия проверки и обработки без знака , а затем используются только младшие 16 бит, поэтому мы получаем что-то, когда ниже этого порога и треугольники соединяются с первыми индексами, когда мы переходим).
Подкласс TriangleMeshBuilder
, чтобы увидеть, могу ли я заставить его принимать эти значения как целые числа, чтобы увеличить этот предел, не сработало, что заставляет меня думать, что где-то в глубоком коде, к которому у нас нет доступа, есть дополнительная ссылка к неподписанным шортам. Похоже, единственная работа - добавить дополнительные буферы вершин, которые предлагает Стив, что легко сделать с существующим классом Mesh.AllocationBuilder
. Я также расскажу об этом в Google Hangouts для разработчиков, чтобы определить, является ли это на самом деле ошибкой или преднамеренным.
Вы пробовали это на других устройствах? –