Nat*_*teS 12 iphone optimization performance rendering opengl-es
我在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)切换到ortho矩阵.6)画几个精灵.7)切换到透视矩阵.8)绘制精灵和一些其他纹理几何.9)切换到ortho矩阵.10)绘制几个精灵(例如,游戏HUD).
步骤1-6绘制了一堆背景的东西.8绘制了大部分游戏内容.10绘制HUD.
正如你所看到的,有很多层,其中一些全屏,一些精灵相当大(屏幕的1/4).这些图层使用半透明,所以我必须按照从前到后的顺序绘制它们.通过需要在视角和其他视角中绘制各种层,这进一步复杂化.
如果需要,我很乐意提供其他信息.在此先感谢任何有关我的问题的性能提示或一般建议!
编辑:
我添加了一些日志记录,看看我正在做多少glDrawArrays调用,以及有多少数据.我每帧做大约20次glDrawArray调用.通常,这些中约有1到6个具有大约40个顶点.其余的调用通常只有2个顶点(一个图像).我只是使用glVertexPointer和glTexCoordPointer.
鉴于渲染器利用率基本上为100%,这表明瓶颈是填充,纹理化和混合像素.旨在优化顶点处理(VBO和顶点格式)或CPU使用(绘制调用批处理)的技术可能无济于事,因为它们不会加速像素处理.
您最好的办法是减少填充的像素数量,并查看不同的纹理格式,以便更好地利用第一代设备上可用的非常有限的内存带宽.尽可能使用PVRTC纹理,否则使用16位无压缩纹理.