我如何优化OpenGL ES 1.1中大型模型的渲染?
我刚刚在我的3D应用程序中完成了VBO的实现,看到渲染速度提高了5-10倍。 以前每秒1-2帧的渲染速度现在是每秒10-11帧。
我的问题是,我可以进一步提高渲染速度吗? 三angular形带会有很大的不同吗? 当前顶点不在面之间共享,每个面都是唯一的,但是重叠。
我的设备利用率为100%,Tiler利用率为100%,Renderer利用率为11%,资源字节为114819072.这是在CAD模型上渲染912,120个面。
有什么build议么?
100%的贴图利用率表明您的瓶颈在于发送到GPU的几何graphics的大小 。 根据我的经验,无论您怎样缩小几何尺寸,都可以缩短渲染时间。 这些调整步骤在过去对我来说很有效:
-
如果你还没有,你可以看看使用索引,这可能会通过消除一些多余的顶点减less几何。 iOS设备中的PowerVR GPU也针对使用索引几何进行了优化。
-
尝试使用较小的数据types作为顶点信息。 我发现我可以使用GLshort而不是GLfloat作为我的顶点和法线,而不会在渲染过程中失去很多的精度。 这将显着压缩你的几何形状,并导致渲染速度提升。
-
Bin类似的颜色顶点,并以一组颜色呈现为一个组,而不是提供每个顶点的颜色信息。 由于不必发送所有这些颜色信息,从这个需求的额外绘制调用的开销将大大超过你获得的加速。 通过在我的大型模型中对颜色进行分类,我看到了渲染时间减less了约18%。
-
你已经在使用VBOs,所以你已经利用了这个优化。
-
不要在任何时候停止渲染pipe道。 删除所有读取当前状态的内容,就像所有的glGet *调用一样,因为它们真的和PowerVR GPU的stream程混淆了。
还有其他一些你可以做的事情会导致更小的性能改进,比如在VBO中使用交错顶点,正常,纹理数据,将数据alignment到4字节边界等等,但是上面的是我发现的在调整我自己的OpenGL ES 1.1应用程序时会产生最大的影响。
苹果公司的OpenGL ES编程指南(适用于iOS)的“ 使用顶点数据的最佳实践 ”部分详细介绍了这些要点。