实现游戏计时器的最有效方法是什么?

时间:2011-11-16 12:11:41

标签: iphone objective-c timer nstimer

我正在写一款iPhone游戏。当用户进行他的第一次移动时,计时器以0.01秒的间隔踢动。显示时间的UILabel每次都会更新。 我注意到在iPod touch第二代和iPhone 3GS上测试iPod的速度较慢(20秒后iPhone显示00:20,00,iPod显示为~00:10,00)。有没有办法让这更可靠?如果我是正确的,NSTimer应该在其自己的线程上运行,不应该被用户交互阻止。

JNK

3 个答案:

答案 0 :(得分:3)

NSTimer文档声明:

  

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

所以准确度可以达到0.1,而不是0.01秒。更不用说你的线程是否因某种原因被阻止了。因此,如果您的开火时间至关重要,那么您应该关注其他事情。阅读此SO post以启动。 Apple有一个节拍器示例代码(其中,时间显然至关重要),但我现在无法找到它。

在任何情况下,如果您使用NSTimer实现计时器,则应记录您的开始时间。然后,每当您更新界面时,只需获取当前时间和开始时间的差异(使用NSDates)。

答案 1 :(得分:0)

确保您没有将计时器从睡眠或延迟中解放出来。您应该始终根据自程序启动或当前时间以来的时钟滴答数等事件更新计时器

抱歉,我对你的语言不太熟悉

答案 2 :(得分:0)

您不能依赖计时器以指定的时间间隔完全运行,因此应始终通过计算时间间隔差异来计算显示时间。而且我怀疑iPhone上的计时器每隔1毫秒就可以运行一次,在Quartz中可以每16毫秒左右进行一次定时器调用,达到60 fps - 所以在1毫秒调度它可能意味着“尽快运行可能的“,在不同的硬件上可能会有很大不同。