【问题标题】:What is the most efficient way of implementing a game timer实现游戏计时器的最有效方法是什么
【发布时间】:2011-11-16 12:11:41
【问题描述】:

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

JNK

【问题讨论】:

    标签: iphone objective-c timer nstimer


    【解决方案1】:

    NSTimer 文档指出:

    由于各种输入源 典型的运行循环管理, 有效解决时间 计时器的间隔被限制为开启 大约 50-100 毫秒。如果一个 计时器的触发时间发生在 运行循环处于非 监控定时器或在很长一段时间 标注,计时器不会触发,直到 下次运行循环检查 计时器。因此,实际时间在 计时器触发的可能 是一个重要的时期后 预定的发射时间。

    所以准确度可能低至 0.1 秒,而不是 0.01 秒。更不用说您的线程是否由于某种原因被阻塞。因此,如果您的点火时间至关重要,您应该考虑其他事情。阅读此SO post 以获取启动信息。 Apple 有一个节拍器示例代码(显然,其中时间很重要),但我现在找不到。

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

    【讨论】:

      【解决方案2】:

      确保您的计时器不是基于睡眠或延迟。您应该始终根据程序启动后的时钟滴答数或当前时间等内容更新计时器

      对不起,我对你的语言不太熟悉

      【讨论】:

        【解决方案3】:

        您不能依靠计时器准确地以指定的时间间隔运行,因此您所显示的时间应始终通过计算时间间隔差来计算。而且我怀疑 iPhone 上的计时器是否可以每 1 毫秒运行一次,在 Quartz 中,可以每 16 毫秒左右调用一次计时器,从而达到 60 fps - 所以将其安排在 1 毫秒可能意味着“尽快运行可能”,在不同的硬件上可能会有很大的不同。

        【讨论】:

        • 0.01s != 1ms。 0.01 秒 = 10 毫秒。 1 秒 = 1000 毫秒。
        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多