我在iPhone上开发了一个OpenGL ES游戏。我的帧率非常低,只有约20fps。在iPhone 3G上使用Xcode OpenGL ES性能工具,它显示:
渲染器利用率:95%至99%
Tiler利用率:约27%
我正在绘制很多相当大的图片,并进行许多混合操作。如果我减少要绘制的图片数量,帧率可以从约20提高到约40,尽管性能工具的结果保持不变(渲染器仍然达到最大值)。我认为我的iPhone 3G填充率受限制,但我不确定。
我的问题是:如何更精确地确定瓶颈在哪里?这是我的最大问题,我不知道花费所有时间的原因。如果是填充速度的问题,除了减少绘制之外,还有什么方法可以改善呢?
我正在使用纹理集。我尝试尽量减少图像绑定次数,但这并不总是可能的(绘制顺序,不能全部适配到一个1024x1024的纹理上等)。每帧我会做10个图像绑定。这似乎相当合理,但我可能错了。
我正在使用顶点数组和glDrawArrays。我的几何形状并不是很多。如果需要,我可以尝试更加精确地描述它们。每个图像由2个三角形组成,我会尽可能地批处理,但有时候(大约一半的时间)也会单独使用glDrawArrays调用绘制图像。除了图像之外,我还有大约60个三角形的几何形状被渲染在大约6个glDrawArrays中。我经常在调用glDrawArrays之前使用glTranslate。
切换到VBOs会提高帧率吗?我认为我的几何形状并不是很多,但可能出于其他原因而更快?
有哪些需要注意的问题可以降低性能?例如,应该避免glTranslate、glColor4g等操作吗?
我每帧在3个位置使用glScissor。每次使用由2个glScissor调用组成,一个用于设置,另一个用于将其重置为以前的状态。我不知道这里是否会对性能产生很大的影响。
如果我使用PVRTC,它能更快地渲染吗?目前我的所有图像都是GL_RGBA。我没有内存问题。我的全屏纹理之一是256x256。使用480x320是否更好,以便手机不必进行任何缩放?还有其他关于纹理尺寸的一般性能建议吗?
以下是我绘制的大致想法,按此顺序:
1) 切换到透视矩阵。 2) 绘制全屏背景图像 3) 绘制带半透明的全屏图像(这个有一个滚动纹理)。 4) 绘制一些精灵。 5) 切换到正交矩阵。 6) 绘制一些精灵。 7) 切换到透视矩阵。 8) 绘制精灵和一些其他纹理几何体。 9) 切换到正交矩阵。 10) 绘制一些精灵(如,游戏HUD)。
步骤1-6绘制了一堆背景内容。第8步绘制了大部分游戏内容。步骤10绘制了HUD。
如您所见,有许多层,其中一些是全屏的,而某些精灵相当大(屏幕的1/4)。这些层使用半透明度,因此必须按背面到前面的顺序绘制它们。这进一步复杂化了需要在正交和透视之间绘制各种层。
如果需要,我很乐意提供其他信息。感谢任何有关性能提示或解决问题的一般建议!
编辑:
我添加了一些日志记录以查看我执行了多少个glDrawArrays调用,以及使用了多少数据。我每帧大约执行20个glDrawArray调用。通常,其中1到6个调用每个都有大约40个顶点。其余的调用通常只有2个顶点(一个图像)。我只使用glVertexPointer和glTexCoordPointer。