我正试图追踪我正在编写的iPhone OpenGL游戏中的瓶颈。游戏本身是2d,包含几百个纹理精灵,每个alpha混合。
就纹理而言,我只使用一次绑定一次的512x512图册,所以我认为它不是带宽问题(至少不是上传纹理)。
我使用仪器来跟踪CPU使用率,内存使用情况和OpenGL ES使用情况。在比赛的重点,我看到了以下内容:
FPS:20 CPU:60% 真实记忆:17Mb 泰勒利用率:21% 提取利用率:45%
我对可能成为瓶颈的事情感到有些困惑?在它成为瓶颈之前,CPU使用率有多高(我知道还有其他应用程序在同一时间运行)? 60%听起来是对的吗?
或者可能是图形数量?我猜不是因为tiler + renderer利用率是那么低。但我必须承认,我不是阅读这些结果的专家。
关于我可能的瓶颈是什么,或者在哪里寻找一个瓶子的任何指示都会感激不尽!
答案 0 :(得分:4)
CPU听起来有点高,你使用了很多像sin / cos这样的三角函数吗?有时这些使用得很糟糕,即粒子系统。尽量将它们保持在最低限度,或者尽可能使用查找表。
Here是一个很好的讨论近似值
答案 1 :(得分:4)
如果你还没有,请阅读Optimizing OpenGL ES for iPhone OS,它有很多关于如何在iPhone上编写快速OpenGL应用程序的有用信息。
答案 2 :(得分:1)
您是否检查了大部分时间内代码的哪些行正在运行?我很确定在仪器中有这个工具。
答案 3 :(得分:1)
虽然你的'渲染'利用率很低,但我认为这是OpenGL调用的CPU端。您可以将此部分视为构建GPU列表,以便在glFlush / glFinish时执行。一旦你打电话给其中一个,GPU实际上就必须做你设置的事情。
虽然我没有在iPhone上工作,但听起来你是受GPU限制的。所以这里列出了我要检查的东西(没有直接在iPhone上工作),按照他们需要多长时间进行调查:
你在打电话给glFinish吗?如果是这样,尝试使用glFlush - glFinish块,而GPU可以做到这一点。
如果您禁用Alpha混合,您会看到明显的加速吗?我不认为这个很可能,但应该快速检查。
您是在对物体进行任何剔除,还是每帧渲染所有物体?
iPhone有没有任何类型的GPU分析器?
答案 4 :(得分:0)
你是如何实现2D游戏的?将每个单独的精灵渲染到自己的三角形配对多边形上吗?或者你是否将每个精灵渲染到512x512纹理表面上?
对于后一种方法,更改每帧的纹理会导致很大的性能损失,因此不建议在文档中使用;真的有点痛苦,glDrawTex可能提供一个解决方法,但我没有测试过这个,我不相信它会起作用。