我正在测试超大 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 万个顶点......)?