Почему игры Cocoa избегают Grand Central Dispatch для создания таймера?

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

person Tobias    schedule 13.02.2011    source источник
comment
Может быть, потому, что NSTimer более известен, менее пугающ, чем GCD, и потому, что GCD — это только MacOS10.6.x/iOS4.x и выше?   -  person nacho4d    schedule 13.02.2011
comment
Ага. Спасибо за ответ. Вероятно, это потому, что он не имеет обратной совместимости.   -  person Tobias    schedule 13.02.2011


Ответы (2)


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

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

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

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

person zoul    schedule 13.02.2011

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

Может быть, потому, что NSTimer более известен, менее пугающ, чем GCD, и потому, что GCD — это только MacOS10.6.x/iOS4.x и выше? — nacho4d 13 фев, в 8:01

person Tobias    schedule 23.02.2011