使用NSTimer获得准确的计时

时间:2009-04-09 14:02:41

标签: iphone cocoa

我需要以非常精确的计时运行我的游戏循环。我正在尝试使用NSTimer来做到这一点,而且我的结果还不错,但有一些偏差。 当NSTimer触发时,下一次事件在处理程序完成时开始计数,或者它是否立即开始计数。 如果前者对我来说是合理的,我可以使用setFireDate来尝试抵消下一个计时器的触发 - 当我尝试这个时,事情似乎更糟。

我的计时器每隔44毫秒启动一次,我想阻止它漂移超过20毫秒。如果它确实漂移了,我想纠正下一场火灾。 尝试使用NSTimer是否合理?

3 个答案:

答案 0 :(得分:5)

我不认为NSTimer会给你“非常”准确的时机。它在运行循环中触发,因此如果它在你的主线程中,那么从UI更新到事件处理的所有内容都会延迟。

答案 1 :(得分:4)

您可以尝试创建一个线程并在该线程的运行循环上安排计时器。将该计时器作为该运行循环的唯一内容应该限制可能干扰它的事物的数量。

如果这不起作用,那么你已经让它在一个线程上工作了,所以你也可以切换到usleep()循环。

答案 2 :(得分:1)

另请注意,NSTimer文档声明:

  

由于各种输入源a   典型的运行循环管理,   有效解决时间问题   计时器的间隔限制为开启   50-100毫秒的顺序。如果一个   计时器的发射时间发生时   运行循环处于不是的模式   监控计时器或长时间   标注,计时器直到没有开火   下次运行循环检查时   计时器。因此,实际时间在   计时器可能发射的是什么   是一段很长的一段时间   预定的开火时间。