10

Cocoa でゲーム ループを作成することについて、インターネット上でかなり話題になっています。私が見たゲーム ループのほとんどは、NSTimer を使用して 60 秒ごとにイベントをトリガーします。以下の Apple の開発者ドキュメントのソース コードのように、Grand Central Dispatch を使用する例がないように見えるのはなぜですか。私が知らない問題はありますか?

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 でのゲーム ループに関する以前 の 2 つの質問があり、より良いアイデアが得られる可能性があります。

要点は、ループ内の別のスレッドでゲーム ループを実行し、反復間の経過時間に従ってゲーム モデルを再計算することです。

- (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 がそれを回答として投稿して緑色にできるようにしてくれたらよかったのにと思いますが、この機会を利用して自己学習者のスキナー ボックスの報酬を獲得しています。

NSTimer が有名で、GCD よりも怖くなく、GCD が MacOS10.6.x/iOS4.x 以降のみであるためでしょうか? – nacho4d 2 月 13 日 8:01

于 2011-02-23T16:31:59.997 に答える