GL_LINES的glDrawElements强制gleRunVertexSubmitARM?(或者:为什么在iOS上绘制线框很慢?)

Fra*_*sco 5 performance wireframe ios opengl-es-2.0

在为我正在研究的iPhone/iPad小项目做一些测试时,我观察到使用gl_LrawElements和GL_LINES绘制线框时会有很大的CPU性能损失.

这是场景:

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

然后:

  • 具有640个顶点的相同模型
  • 2560指数
  • 维也纳国际组织,没有VAO
  • 使用gl_LrawElements绘制GL_LINES触发连续调用gleRunVertexSubmitARM,CPU使用天空火箭......

在这两种情况下,模型看起来都像预期的那样,周围没有任何错误......

似乎问题是设备依赖的.我在iPhone 3GS和iPhone 4上体验它,而不是iPad 2和模拟器.在iPad 2帧时间CPU = 1ms并且没有调用gleRunVertexSubmitARM,在iPhone 4帧时间CPU = 12ms并且连续调用gleRunVertexSubmitARM.

任何人都可以解释这种行为或指出我可能犯的错误吗?

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

弗朗切斯科

Mau*_*tti 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 网格平移为三角形。这是我无法证明的事情,但却是过去游戏引擎开发者朋友们非常常见的话题。

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

你好毛里齐奥