10

我在互联网上看到了很多关于在 Cocoa 中创建游戏循环的讨论。我见过的大多数游戏循环都使用 NSTimer 每 60 秒触发一次事件。为什么似乎没有使用 Grand Central Dispatch 的示例,例如下面 Apple 开发人员文档中的源代码。有没有我不知道的问题?

dispatch_source_t CreateDispatchTimer(uint64_t interval,
              uint64_t leeway,
              dispatch_queue_t queue,
              dispatch_block_t block)
{
   dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
                                                     0, 0, queue);
   if (timer)
   {
      dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
      dispatch_source_set_event_handler(timer, block);
      dispatch_resume(timer);
   }
   return timer;
}
4

2 回答 2

12

这并不能真正回答您的问题,但是常规计时器并不是完美的游戏循环解决方案(尽管它可能是最简单的解决方案)。有一篇关于游戏循环编程的非常好的文章和关于 SO 上的游戏循环的两个先前的 问题,可能会给你更好的想法。

重点是在一个单独的线程上运行游戏循环,并根据迭代之间经过的时间重新计算游戏模型:

- (void) gameLoop
{
    while (running) {
        CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();
        CFTimeInterval deltaTime = now - lastTime;
        [self updateModelWithDelta:deltaTime];
        [self renderFrame];
        lastTime = now;
    }
}

这将为您提供最大的平滑度。阅读链接资源以获取更多信息,编写一个漂亮的线程游戏循环并不难,而且会产生很大的不同,恕我直言。

于 2011-02-13T09:43:43.410 回答
2

这就是我认为的答案。我希望 nacho4d 将其作为答案发布,以便我可以将其绿化,但我正在利用这个机会获得自学者 Skinner Box 奖励。

可能是因为 NSTimer 比 GCD 更出名,没有那么可怕,而且因为 GCD 只有 MacOS10.6.x/iOS4.x 及以上?– nacho4d 2 月 13 日 8:01

于 2011-02-23T16:31:59.997 回答