当有许多重复顶点时,glDrawElements()比glDrawArrays()更有效吗?

时间:2010-01-15 16:40:44

标签: iphone opengl-es

我正试图从我的iPhone OpenGL ES应用程序中挤出一些性能提升。根据Instruments的说法,我的贴片机使用率在大多数情况下接近100%,我的FPS大约是24.我想让我的FPS达到30以上。我可以通过从GL_FLOAT转换到GL_SHORT到达那里,但是对我来说,技术问题相当令人生畏。我宁愿不去那里。

所以,我正在考虑从glDrawArrays()切换到glDrawElements()。我有35个网格由708个顶点组成,但很多这些顶点在面之间共享。我是纹理贴图,但网格颜色大致均匀。需要特殊纹理的面将保留原样。

假设我可以将顶点数减少一半。让我们也说我也以对iPhone有意义的方式组织我的几何:比如说,使用Imagination Technologies PVRTTriStrip工具。忽略索引数组的少量额外内存,这意味着我已经将内存带宽大致减少了一半,所以我应该看到相当不错的性能提升。

这是真的,还是我遗失或误解了什么?建议表示赞赏。

2 个答案:

答案 0 :(得分:17)

如果有人感兴趣,我继续尝试这个,没有PVRTTriStrip工具部分。所有测试都在iPhone 3G上完成。我能够将我的顶点从708缩放到113.而且由于我低于255,我使用GLubyte作为我的索引类型。所以,我来自:

35 *(708 * 32)= ~774K

要:

35 *(113 * 32 + 708 * 1)= ~148K

这使我的总内存带宽降低到原来的20%以下。我的FPS增加到~34。所以,我看到FPS大约提高了42%。总的来说,我很开心。我认为还有更多的东西可以获得,但我现在有更大的鱼来煎炸。

另外,我过滤掉了一堆退化三角形(不是有用的类型),使我的索引数从708减少到522.从那里我看到从我看到的~34 FPS增加到~40 FPS。

答案 1 :(得分:1)

如果您在乐器中使用100%的Tiler利用率(like I was),则会受到几何体大小的限制。在我试图提高性能的所有事情中,当我减小几何尺寸时,我只注意到帧速率的显着提升。所以,是的,如果你可以消除一些顶点被发送,你应该看到性能的提升。

即使您声明很难做到,我强烈建议您从GL_FLOAT转换为GL_SHORTs,因为您会看到渲染速度大幅提升。我在我的应用程序中这样做了,实现这种回报并没有太多麻烦。