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

Я смотрю далеко в интернете, обсуждая создание игровых петель в Cocoa. Большинство игровых циклов, которые я видел, используют NSTimer для запуска события каждые 60 секунд. Почему нет примеров использования Grand Central Dispatch, например, в исходном коде документации Apple Developers. Есть ли проблема, о которой я не знаю?

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;
}

Ответ 1

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

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

Ответ 2

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

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

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

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