5

在为我正在处理的 iPhone/iPad 的一个小项目做一些测试时,我观察到在使用带有 GL_LINES 的 glDrawElements 绘制线框时会出现很大的 CPU 性能损失。

这是场景:

  • 一个有 640 个顶点的模型(4 个浮点数表示位置,3 个浮点数表示法线,没有对齐问题……全部在 4 个字节边界上)
  • 3840 个索引(无符号短)
  • 顶点和索引都使用 VBO(无 VAO)
  • 上面使用带有 GL_TRIANGLES 的 glDrawElements 绘制的模型工作正常

然后:

  • 相同的模型有 640 个顶点
  • 2560 个索引
  • VBO 没有 VAO
  • 使用带有 GL_LINES 的 glDrawElements 绘制会触发对 gleRunVertexSubmitARM 的连续调用,CPU 使用率飙升...

在这两种情况下,模型看起来都符合预期,并且没有 glErrors...

似乎问题与设备有关。我在 iPhone 3GS 和 iPhone 4 上体验它,而不是在 iPad 2 或模拟器上体验。在 iPad 2 帧时间 CPU = 1 毫秒并且没有调用 gleRunVertexSubmitARM,在 iPhone 4 帧时间 CPU = 12 毫秒并且连续调用 gleRunVertexSubmitARM。

谁能解释这种行为或指出我可能犯的错误?

任何见解都受到高度赞赏。提前致谢,

弗朗切斯科

4

2 回答 2

1

我会说一个不容易的问题,这不是一个简单的答案。

无论如何,同一个“家族”的两个设备以不同方式表现的原因可能取决于许多因素。

首先,它们安装了不同的 GPU(我很确定你已经知道了,很抱歉说的很明显),这带来了以下差异:

  • Iphone 4 和 Iphone 3GS 安装同一个 GPU,PowerVR SGX535
  • IPAD 2 使用 PowerVR SGX543MP2

首先,后者是前者的演进,具有不同的吞吐量和更新的架构。

仅此一点并不能解释一切,您注意到更多对 gleRunVertexSubmitARM 的调用的原因可以解释为 PowerVR 在其 GPU 上执行的 OpenGL 驱动程序实现,很可能 SGX535 GPU 驱动程序通过该函数的挂钩执行您需要的操作.

最后但同样重要的是,在性能方面,使用 GL_LINES 绘图在大多数情况下效率很低,原因如下:

  • 不执行任何隐藏几何检测
  • 不执行任何面部剔除
  • 阅读(以及我自己 2-3 年前的经验),使用 GL_LINE_WIDTH 或 GL_LINE_SMOOTH 会导致驱动程序执行“软件”渲染而不使用任何硬件加速。这取决于 GPU 及其 OpenGL 驱动程序的实现
  • 渲染填充多边形时,驱动程序可以使用“分层深度缓冲区”优化操作,而使用 GL_LINES 则不能(同样,这在很大程度上取决于驱动程序,但这是一个非常常见的方面)
  • 一些驱动程序在渲染时将您的 GL_LINES 网格转换为三角形。这是我无法证明的事情,但这是过去游戏引擎开发者朋友非常普遍的话题。

我希望能以某种方式帮助你。

乔·毛里齐奥

于 2014-05-08T07:13:11.497 回答
0

我在PC上,但我觉得这是相关的。我注意到线框模式下的帧速率:glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)...

如果 glEnable(GL_LINE_SMOOTH); 则慢 10 倍;

您可以使用以下命令禁用它:glDisable(GL_LINE_SMOOTH);

于 2017-11-28T16:18:21.007 回答