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