【发布时间】:2012-05-30 21:58:43
【问题描述】:
我编写了一个快速应用程序来感受 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 针对 Steve Blackwell 的见解,我有一些额外的想法。
第 710-712 行确实将 int 索引向下转换为 short,因此正如史蒂夫指出的那样,65536 变为 0。此外,第 757 行的“演员表”与其说是演员表,不如说是告诉 RenderScript 最终将发送给它的二进制数据的格式。 RenderScript 要求将所有数据打包到称为 Allocation 的 RenderScript 特定数据类型中,以便从 Java 移动到 RenderScript 运行时,这需要了解数据结构。根据 Steve 认为这是一个错误的观点,第 757 行通知 RenderScript 将索引数据视为short(无符号 16 位),但它会发送一个 32 位有符号值(由于缺少检查和处理无符号,然后只使用低 16 位,因此为什么我们在低于此阈值时绘制一些东西,而当我们超过时,三角形连接回第一个索引)。
子类化TriangleMeshBuilder 看看我是否可以让它接受这些值作为整数来增加这个限制不起作用,这让我相信在我们无法访问的深层代码的某个地方,还有一个额外的参考未签名的短裤。看起来唯一的解决方法是按照史蒂夫的建议添加额外的顶点缓冲区,这很容易通过现有的Mesh.AllocationBuilder 类完成。我还将在开发者环聊中向 Google 提出,以确定这实际上是错误还是故意的。
【问题讨论】:
-
你在其他设备上试过了吗?
标签: android renderscript