我刚刚在我的3D应用程序中实现了VBO,并且看到了大约5-10倍的渲染速度提升。以前每秒只能渲染1-2帧,现在可以渲染10-11帧。
我的问题是,是否有任何进一步的改进可以提高渲染速度?三角形条带会产生很大的差异吗?目前面之间没有共享顶点,每个面的顶点都是唯一的但重叠的。
我的设备利用率为100%,Tiler利用率为100%,Renderer利用率为11%,资源字节数为114819072。这是在CAD模型上渲染912,120个面。
有什么建议吗?
瓦工利用率达到100%表示您的瓶颈在于发送到GPU的几何图形的大小。 尽可能缩小几何图形的大小可以使渲染时间几乎线性减少,这是我的经验。 过去,这些调整步骤对我有效:
如果尚未使用索引,请尝试使用索引,这可能通过消除一些冗余顶点来减少几何图形。 iOS设备中的PowerVR GPU优化了使用索引的几何图形。
尝试为顶点信息使用较小的数据类型。 我发现,即使使用GLshort而不是GLfloat来表示我的顶点和法线,也不会失去太多渲染精度。 这将显着压缩几何图形并导致渲染速度的大幅提高。
将颜色相似的顶点分组,并以设置的颜色渲染它们,而不是提供每个顶点的颜色信息。 虽然需要额外的绘制调用,但由于不必发送所有颜色信息,因此产生的开销将远远超过速度提升。 通过对较大模型中的颜色进行分组,我看到了约18%的渲染时间缩短。
您已经使用了VBO,因此已经利用了该优化。
不要在任何时候停止渲染管道。 剪切读取当前状态的任何内容,例如所有glGet *调用,因为它们会影响PowerVR GPU的流程。
有其他一些事情可以做,这将带来更小的性能提升,例如在VBO中使用交错的顶点、法线和纹理数据,将数据对齐到4字节边界等,但以上这些是我发现对调整自己的OpenGL ES 1.1应用程序具有最大影响的。
这些大部分要点在苹果的iOS OpenGL ES编程指南的"处理顶点数据的最佳实践"章节中得到了很好的涵盖。