2

我编写了一个快速应用程序来感受 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 一起提出,以确定这实际上是错误还是故意的。

4

2 回答 2

3

我对 RenderScript 几乎一无所知,所以我不知道这是一些固有的限制、硬件问题还是与 TriangleMeshBuilder 相关的问题,但我敢打赌,在编号 65535 之后,您的三角形已经用完了。

这是一个幻数,因为它是无符号 16 位整数的最大值。(维基百科

我怀疑代码中的某处有一个unsigned short包含三角形数量的。它不会出现在 Java 代码中,因为 Java 没有无符号值。并且限制可能不是硬件,因为 CPU 寄存器/路径 >= 32 位。所以我会检查TriangleMeshBuilder。

编辑:

这是第 553 行的一个很好的发现。每个索引的值都必须适合short. 看起来沮丧正在发生在第 710-712 行

我假设你在打电话addTriangle()。该函数需要三个ints,然后显式转换为short. 我认为这是一个错误,因为向下转换是无声地发生的,这不是您对函数签名的期望。

第 768 行,该虚假数据被传递给Allocation.copy1DRangeFromUnchecked(). 我没有一直遵循它,但我想在某些时候,那些有符号的值会被强制转换为无符号:-32768 到 -1 会变回 32768 到 65535。所以把索引变成负数看起来很糟糕,但它只是重新解释相同的数据,这并不是一个真正的问题。

真正的问题从您发送 65536 之类的值开始。当 65536 转换为 ashort时,它变成 0。这是真正的数据丢失。现在您指的是不同的索引,而强制转换为 unsigned 并不能解决它。

真正的关键是这copy1DRangeFromUnchecked()是一个重载函数,其中一个重载需要一个int[],所以这些都不是问题。

对于解决方法,我想您可以继承TriangleMeshBuilder并覆盖成员变量mIndexData[]和方法addTriangle()。或者,也许您可​​以使用多个顶点缓冲区。或者在某个地方提交错误报告?无论如何,有趣的问题。

于 2012-05-30T22:23:13.847 回答
1

这可能是因为 OpenGL ES 只允许short元素索引,而不是int. 资料来源:http ://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-2.1:-Buffers-and-Textures.html (搜索“OpenGL ES”)

于 2012-06-10T20:19:06.343 回答