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

Rob*_*nes 9 iphone opengl-es

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

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

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

这是真的,还是我错过了或误解了什么?建议表示赞赏.

Rob*_*nes 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.