我正在制作一款iPhone游戏,它使用像素着色器。有些效果使得我的fps速率有时会下降到3GS的~22 FPS,但大部分时间都在~27左右。 当FPS速率下降时,触摸手势响应变得非常不连贯。换句话说,手势更新时间接近5hz,这比游戏本身慢得多。
有没有人遇到过类似的问题?有什么方法吗?
注1:我已经在使用CADisplayLink
了 编辑:通过手动跳过框架,我获得了显着的改进。我不确定这是否是一件好事,但游戏仍然可以玩,而且我确信它现在使用的CPU少得多。答案 0 :(得分:1)
我的一个应用程序中有类似的情况,我有非常沉重的着色器,可能导致旧设备上的渲染速度变慢,但我仍然希望帧速率能够在更强大的硬件上尽可能快。< / p>
我所做的是使用单个GCD串行队列进行所有与OpenGL ES渲染相关的操作,并结合调度信号量。我使用CADisplayLink以60 FPS触发,然后在回调中我为实际渲染操作调度一个块。我使用调度信号量,这样如果CADisplayLink尝试在运行时将另一个块添加到渲染队列,则该新块将被删除并且永远不会添加。
我在this answer中详细介绍了这种方法,您可以下载使用此here的应用程序的源代码。
GCD队列允许您将此渲染移动到后台线程,使您的界面保持响应,同时缩放FPS,以便您的渲染以您的硬件支持的速度运行。这在新的双核iOS设备上具有特别的优势,因为我注意到通过在此后台队列上执行我的OpenGL ES更新,显着提高了渲染速度。
但是,正如我在该答案中所描述的那样,您需要通过此队列汇集所有OpenGL ES更新,以避免多个线程同时访问OpenGL ES上下文(导致崩溃)的可能性。