Что лучший путь состоит в том, чтобы создать игровой цикл на iPhone кроме использования NSTimer?

Вы также можете пойти и импортировать с помощью доброй старой необходимости, то есть:

const _get: any = require('lodash.get');

Это единственное, что сработало для нас. Конечно, убедитесь, что вызовы require () поступают после импорта.

23
задан The Archetypal Paul 10 November 2008 в 14:31
поделиться

2 ответа

Можно получить лучшую производительность с потоками, попробовать что-то вроде этого:

- (void) gameLoop
{
    while (running)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self renderFrame];
        [pool release];
    }
}

- (void) startLoop
{
    running = YES;
#ifdef THREADED_ANIMATION
    [NSThread detachNewThreadSelector:@selector(gameLoop)
    toTarget:self withObject:nil];
#else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}

- (void) stopLoop
{
    [timer invalidate];
    running = NO;
}

В renderFrame метод Вы готовите кадровый буфер, тянете кадр и представляете кадровый буфер на экране. (P.S. существует великое статья о различных типах игровых циклов и их за и против.)

18
ответ дан Lou Franco 29 November 2019 в 02:54
поделиться

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

  • Определяют интервал обновления, которым Вы были бы довольны, и это больше, чем единственная передача через Ваш основной цикл.
  • В начале цикла, возьмите текущую метку времени любого разрешения, Вы имеете в наличии и храните его.
  • В конце цикла, возьмите другую метку времени и определите прошедшее время начиная с последней метки времени (инициализируйте это перед циклом).
  • сон/задержка для различия между Вашим идеальным временем кадра и уже прошедшим временем это для кадра.
  • В следующем кадре, можно даже попытаться компенсировать погрешности в интервале сна по сравнению с меткой времени в начале предыдущего цикла. Сохраните различие и добавьте/вычтите его от интервала сна в конце этого цикла (сон/задержка может идти слишком долго ИЛИ слишком короткий).

Вы могли бы хотеть иметь аварийный механизм, который сообщает, синхронизируете ли Вы, слишком трудно (я, e, если бы Ваше время сна после всей компенсации - меньше чем 0, которые означали бы, что Вы занимаете больше времени для обработки, чем частота кадров позволяет). Эффект будет состоять в том, что Ваша игра замедляется. Для дополнительных очков можно хотеть упростить рендеринг некоторое время при обнаружении этого случая пока у Вас нет достаточной резервной мощности снова.

4
ответ дан Galghamon 29 November 2019 в 02:54
поделиться