Почему игры Какао избегают Grand Central Dispatch для создания таймера? - PullRequest
10 голосов
/ 13 февраля 2011

Я много смотрел в интернете, обсуждая создание игровых петель в Какао. Большинство игровых циклов, которые я видел, используют 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;
}

Ответы [ 2 ]

12 голосов
/ 13 февраля 2011

Это на самом деле не отвечает на ваш вопрос, но обычный таймер не является идеальным решением для игрового цикла (хотя он может быть самым простым). Существует очень хорошая статья о программировании игрового цикла и два предыдущих вопроса об игровых циклах на SO, которые могут дать вам лучшие идеи.

Главное - запустить игровой цикл в отдельном потоке в цикле и пересчитать модель игры в соответствии с временем, прошедшим между итерациями:

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

Это даст вам максимальную плавность. Прочитайте ссылки на источники для получения дополнительной информации, написание хорошего многопоточного игрового цикла не сложно и имеет большое значение, ИМХО.

2 голосов
/ 23 февраля 2011

Это то, что я думаю, ответ.Я бы хотел, чтобы nacho4d опубликовал его в качестве ответа, чтобы я мог его озеленить, но я использую эту возможность, чтобы получить награду Skinner Box для самообучающихся.

Возможно, потому что NSTimer более известен, менеестрашнее чем GCD и потому что GCD это только MacOS10.6.x / iOS4.x и выше только?- 13 февраля в 8: 01

...