我的 iPhone 上有一个 Open GL ES 游戏。我的帧率很糟糕,~20fps。在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具,它显示:
渲染器利用率:95% 至 99%
瓷砖利用率:~27%
我正在绘制很多非常大的图像并进行大量混合。如果我减少绘制的图像数量,帧速率会从 ~20 变为 ~40,但性能工具结果保持大致相同(渲染器仍然达到最大值)。我认为我受到了 iPhone 3G 填充率的限制,但我不确定。
我的问题是:如何更详细地确定瓶颈在哪里?这是我最大的问题,我只是不知道是什么在持续。如果是填充率,除了减少绘制之外,我还能做些什么来提高它吗?
我正在使用纹理图集。我尝试最小化图像绑定,尽管这并不总是可行(绘制顺序、并非所有内容都适合一个 1024x1024 纹理等)。每帧我都会进行 10 个图像绑定。这看起来很合理,但我可能是错的。
我正在使用顶点数组和 glDrawArrays。我确实没有太多的几何知识。如果需要的话我可以尝试更精确。每个图像都是 2 个三角形,我尝试对可能的事情进行批处理,尽管通常(也许一半的时间)图像是使用单独的 glDrawArrays 调用绘制的。除了图像之外,我还有大约 60 个三角形的几何体在大约 6 个 glDrawArrays 调用中渲染。我经常在调用 glDrawArrays 之前进行 glTranslate。
切换到 VBO 会提高帧速率吗?我不认为这是一个巨大的几何体量,但也许由于其他原因它更快?
是否需要注意某些可能会降低性能的事情?例如,我应该避免使用 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)。这些图层使用半透明,因此我必须按从后到前的顺序绘制它们。由于需要以正交方式绘制各个图层并以透视方式绘制其他图层,这使得情况变得更加复杂。
如果需要,我很乐意提供更多信息。预先感谢您提供有关我的问题的任何性能提示或一般建议!
Edit:
我添加了一些日志记录来查看我正在执行多少次 glDrawArrays 调用以及有多少数据。我每帧执行大约 20 次 glDrawArray 调用。通常,其中大约 1 到最多 6 个每个都有大约 40 个顶点。其余的调用通常只是 2 个顶点(一张图像)。我只是使用 glVertexPointer 和 glTexCoordPointer。