iOS上的OpenGL ES的CADisplayLink准确性问题

时间:2012-01-30 08:20:46

标签: iphone ios opengl-es grand-central-dispatch cadisplaylink

我的iOS游戏目前正在使用CADisplayLink来定时OpenGL渲染操作。我有一个在第二个线程上运行的GCD调度队列,它发出所有OpenGL渲染和状态调用GPU。一切都很好,除了时机不完美。即使动画间隔从1(60Hz)变为2(30Hz),我也偶尔会看到帧跳过和毛刺。

CADisplayLink从主线程上的RunLoop调用您的选择器,这意味着它只能在其他调度作业和主线程正在处理的输入事件之间触发。 (我已经通过记录这些工作/事件证实了这种情况)。如果这些操作需要几毫秒,那么CADisplayLink将永远不会完全准确,因为它不能中断当前在主线程上运行的任何内容。正如我想象的大多数游戏一样,我在主线程上运行游戏模拟,物理和场景剔除。

所以我想的是我应该将所有游戏模拟和物理内容从主线程移开,以便触摸事件和CADisplayLink可以尽可能接近它发射。但我不确定这是否可以解决任何问题,而且这不是一项微不足道的工作。

我想知道,因为presentRenderBuffer调用实际上是将你的帧与实际硬件显示同步的东西,也许我只需要一个真正准确的定时器,它可以在它自己的线程中运行(可能具有更高的优先级)和以这种方式触发渲染。然后我可以将所有内容保留在主线程上。似乎所有CADisplayLink都提供了一种在我的代码运行速度超过60Hz的情况下等待的方法,所以在我看来,类似的延迟可以使用单独的线程轻松编码。我在这里缺少什么?

0 个答案:

没有答案