【发布时间】:2011-02-16 15:46:12
【问题描述】:
我在 iPhone 上有一个 Open GL ES 游戏。我的帧率非常糟糕,~20fps。在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具,它显示:
渲染器利用率:95% 到 99%
Tiler 利用率:~27%
我正在绘制很多非常大的图像,并进行了很多混合。如果我减少绘制的图像数量,帧率会从 ~20 变为 ~40,尽管性能工具的结果保持大致相同(渲染器仍然最大化)。我认为我受到 iPhone 3G 填充率的限制,但我不确定。
我的问题是:如何更详细地确定瓶颈在哪里?这是我最大的问题,我只是不知道一直在做什么。如果是fillrate,除了少画,还有什么可以改进的吗?
我正在使用纹理图集。我试图最小化图像绑定,尽管这并不总是可能的(绘图顺序,并非所有内容都适合一个 1024x1024 纹理等)。每帧我做 10 个图像绑定。这看起来很合理,但我可能弄错了。
我正在使用顶点数组和 glDrawArrays。我真的没有很多几何。如果需要,我可以尝试更精确。每个图像都是 2 个三角形,我尝试批量处理,但通常(可能有一半时间)图像是使用单独的 glDrawArrays 调用绘制的。除了图像,我在 ~6 个 glDrawArrays 调用中渲染了 ~60 个三角形的几何图形。我经常在调用 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)。图层使用半透明,所以我必须以从后到前的顺序绘制它们。由于需要在正交和其他透视图中绘制各个层,这使情况变得更加复杂。
如果需要,我很乐意提供更多信息。提前感谢您针对我的问题提供的任何性能提示或一般性建议!
编辑:
我添加了一些日志来查看我正在执行多少个 glDrawArrays 调用,以及有多少数据。我每帧执行大约 20 个 glDrawArray 调用。通常其中大约 1 到 6 个具有大约 40 个顶点。其余的调用通常只有 2 个顶点(一个图像)。我只是在使用 glVertexPointer 和 glTexCoordPointer。
【问题讨论】:
-
确定您是否受到填充限制的一个好方法是更改您要绘制的区域的大小。如果减小尺寸会提高帧速率,则表示填充受限。
标签: iphone performance optimization opengl-es rendering