gpt4 book ai didi

iOS OpenGL ES 2.0 VBO 顶点计数限制 : Once exceeded, CPU 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 17:35:56 26 4
gpt4 key购买 nike

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

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

enter image description here enter image description here

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

但是,一旦我达到 200 万个以上的顶点网格,一切都会变得糟糕,因为我们在这里看到大量 CPU 绑定(bind)情况,并且所有仪器都报告每秒 1 帧的性能。

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

那么,问题来了,这个限制是多少,怎么查询呢?如果我可以合理地保证我的应用程序能够正常运行而无需详尽地测试每台设备,那将是非常可取的。

我还看到了解决这个问题的另一种方法,即坚持一个已知的良好 VBO 大小限制(我读到大约 4MB 是一个很好的限制),并且基本上只是让 CPU 工作一点点,如果网格被渲染是可怕的。对于 100MB 的 VBO,将它分成 4MB block (将网格分割成 25 个绘制调用)听起来并没有那么糟糕。

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

最佳答案

在纯 OpenGL 中,有两个实现定义的属性:GL_MAX_ELEMENTS_VERTICESGL_MAX_ELEMENTS_INDICES。在某些实现中,超出的性能可能会下降。

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

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

关于iOS OpenGL ES 2.0 VBO 顶点计数限制 : Once exceeded, CPU 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18627030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com