【发布时间】:2010-12-23 02:51:49
【问题描述】:
我正在开发一个严重依赖 OpenGL 的 iPhone 应用程序。现在它在 iPhone 3G 上运行有点慢,但在新的 32G iPod Touch 上看起来很流畅。我认为这是与硬件相关的。无论如何,我想让 iPhone 的性能类似于 iPod Touch 的性能。我相信我在 OpenGL 中做的很多事情都不是最理想的,我想请教一下哪些改进会给我带来最大的收益。
我的场景渲染是这样的:
- 重复 35 次
- glPushMatrix
- glLoadIdentity
- gl翻译
- 重复 7 次
- glBindTexture
- glVertexPointer
- glNormalPointer
- glTexCoordPointer
- glDrawArrays(GL_TRIANGLES, ...)
- glPopMatrix
我的顶点、法线和纹理坐标已经交错了。
那么,我应该采取哪些步骤来加快速度?你会先尝试哪一步?
我的第一个想法是使用纹理图集来消除所有那些 glBindTexture() 调用。
一些更有效的矩阵运算呢?我知道 gl*() 版本效率不高。
VBO 呢?
更新
有 8260 个三角形。 纹理大小为 64x64 png。有 58 种不同的纹理。
我没有运行仪器。
更新 2
在 iPhone 3G 上运行 OpenGL ES Instrument 后,我发现我的 Tiler Utilization 在 90-100% 范围内,而我的 Render Utilization 在 30% 范围内。
更新 3
纹理图集对该问题没有明显影响。使用范围仍如上文所述。
更新 4
将我的 Vertex 和 Normal 指针转换为 GL_SHORT 似乎提高了 FPS,但 Tiler Utilization 在很多时候仍处于 90% 的范围内。我仍在使用 GL_FLOAT 作为纹理坐标。我想我可以将它们降低到 GL_SHORT 并为每个顶点节省四个字节。
更新 5
将我的纹理坐标转换为 GL_SHORT 产生了另一个性能提升。我现在一直获得> 30 FPS。瓷砖利用率仍然在 90% 左右,但经常下降到 70-80% 的范围内。渲染器利用率徘徊在 50% 左右。我想这可能与从 GL_TEXTURE 矩阵模式缩放纹理坐标有关。
我仍在寻求更多改进。我希望接近 40 FPS,因为这就是我的 iPod Touch 所获得的,而且它在那里如丝般顺滑。如果有人还在关注,我还能摘什么低调的果实?
【问题讨论】:
-
你有多少个三角形?你的纹理有多大?第一个问题是您是否根据几何数量、正在处理的像素数量或主机 CPU 达到限制。您是否尝试过使用 Instruments 来分析 CPU 或 GPU?
-
是的,32 位。怎么去RGB565?我使用 GIMP 来创建我的纹理图集,如果这有什么不同的话。
-
请参阅下面关于 RGB565 和 PVRTC 的新答案