我编写了一个快速应用程序来感受 RenderScript 的限制,并发现当达到大约 65,000 个三角形时,系统根本不会绘制任何额外的三角形。例如,如果我创建一个包含 70,000 个三角形的圆柱体,则圆柱体中缺少一个楔形,对应于超过 ~65,000 个计数的三角形。三角形是有纹理的,为了便于编写应用程序,我只是使用了一个TriangleMeshBuilder
类,因此没有进行真正的优化,例如使用 trifans 或 tristrips。硬件是三星 Galaxy Nexus。LogCat 报告的堆大小约为 15MB,其中 3% 可用。我没有收到有关图形系统或 RenderScript 的错误或警告。
谁能解释三角形被丢弃的原因?我是否处于 RenderScript 可以正常处理的硬件限制?
更新发生在三星 Galaxy Nexus (4.0.3)、三星 Galaxy Tab 7.0+ (3.2) 和摩托罗拉 Xoom (3.2) 上。全部在大约 65,000 个三角形的同一点上。这些设备中的每一个都有不同的 GPU。
更新 2针对史蒂夫布莱克威尔的见解,我有一些额外的想法。
第 710-712 行确实将int
索引向下转换为short
,因此正如史蒂夫指出的那样,65536 变为 0。此外,第 757 行的“演员表”与其说是演员表,不如说是告诉 RenderScript 最终将发送给它的二进制数据的格式。RenderScript 要求将所有数据打包到称为 an 的 RenderScript 特定数据类型中,Allocation
以便从 Java 移动到 RenderScript 运行时,并且需要告知数据结构。根据 Steve 认为这是一个错误的观点,第 757 行通知 RenderScript 将索引数据视为short
(无符号 16 位),但它向它发送一个 32 位有符号值(由于缺少检查和处理无符号,这将被接受,然后只使用低 16 位,因此为什么我们在低于此阈值和三角形时会绘制一些东西当我们过去时连接回第一个索引)。
子类化TriangleMeshBuilder
看看我是否可以让它接受这些值作为整数来增加这个限制不起作用,这让我相信在我们无法访问的深层代码的某个地方,有一个对无符号短裤的额外引用。看起来唯一的解决方法是按照史蒂夫的建议添加额外的顶点缓冲区,这很容易用现有的Mesh.AllocationBuilder
类完成。我还将在 Developer Hangouts 中与 Google 一起提出,以确定这实际上是错误还是故意的。