3

我正在测试超大 3d 网格的渲染,我目前正在 iPhone 5 上进行测试(我也有 iPad 3)。

我这里有两张带有分析运行的 Instruments 屏幕截图。第一个是渲染一个 1.3M 的顶点网格,第二个是渲染一个 2.1M 的顶点网格。

在此处输入图像描述 在此处输入图像描述

顶部的蓝色直方图显示 CPU 负载,可以看出对于第一个网格,CPU 负载徘徊在约 10% 左右,因此 GPU 承担了大部分繁重工作。网格非常详细,如果我自己这么说的话,我的带镜面反射的点光着色器让它看起来非常令人印象深刻,因为它能够以每秒 20 帧以上的速度持续渲染。哦,还启用了 4x MSAA!

然而,一旦我升级到超过 200 万个顶点网格,一切都会变得一团糟,因为我们在这里看到了大量的 CPU 受限情况,并且所有仪器都报告每秒 1 帧的性能。

所以,很明显,在这两个资产之间的某个地方(我承认它们都是在一个 VBO 下加载的非常大的网格),无论是顶点缓冲区大小还是索引缓冲区大小都超过了限制, 2megavertex (462K tris) 网格超出了一些限制。

那么,问题是,这个限制是多少,我该如何查询呢?如果我能有一些合理的保证,我的应用程序将运行良好,而无需详尽地测试每台设备,那将是非常可取的。

我还看到了解决这个问题的另一种方法,即坚持已知的良好 VBO 大小限制(我已经读过大约 4MB 是一个很好的限制),并且如果正在渲染的网格基本上只是让 CPU 工作更努力一点是滔天。对于 100MB VBO,将其分成 4MB 块(将网格划分为 25 个绘制调用)听起来并没有那么糟糕。

但是,我还是很好奇。如何检查最大大小以解决 CPU 回退问题?我是否会遇到内存不足的情况,而 Apple 只是在应用基于 CPU 的解决方法(哦,上帝保佑,立即模式下有 200 万个顶点......)?

4

1 回答 1

2

在纯 OpenGL 中,有两个实现定义的属性:GL_MAX_ELEMENTS_VERTICESGL_MAX_ELEMENTS_INDICES. 在某些实现中,当超出性能时可能会跌落悬崖。

我花了一段时间查看 OpenGL ES 规范以找到等效的规范,但找不到它。有可能它隐藏在 OES 之一或 OpenGL ES 上特定于供应商的扩展中。然而,您可以绘制的元素数量和顶点数量存在非常实际的硬件限制。在索引过多的点之后,您可能会超出 T&L 后缓存的容量。200 万对于单个绘图调用来说是很多,而不是能够查询 OpenGL ES 实现以获取此信息,我会尝试连续降低二次幂,直到您将其拨回最佳位置。

65,536 曾经是 DX9 硬件的最佳选择。这是 16 位索引的限制,并且始终保证低于最大硬件顶点数。很有可能它也适用于 OpenGL ES 类硬件......

于 2013-09-05T03:15:25.330 回答