Игровой цикл с отдельным таймером для рендеринга и игровой логики

Я хочу разделить игровую логику и рендеринг на два разных цикла, потому что я не хочу, чтобы частота кадров контролировала скорость игры. Я попытался добиться этого, создав CADisplayLink для рендеринга и NSTimer для игровой логики.Но затем произошла странная вещь:

Иногда (1 из 15 приложений запускается) игра работает с очень низким fps (около 5-10), но в остальное время все проходит совершенно гладко. Если я удалю NSTimer игровой логики и объединю два цикла, частота кадров в секунду будет стабильно высокой, но это, очевидно, неприемлемое решение. Похоже, что иногда два таймера «задерживают друг друга» или что-то в этом роде, но я не совсем понимаю внутреннюю работу циклов выполнения.

Вот как я создаю таймер и отображаемую ссылку:

NSTimer *gameTimer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1.0 / 60.0 target:self selector:@selector(gameTimerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
[gameTimer release];

CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[aDisplayLink setFrameInterval:animationFrameInterval];
[aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = aDisplayLink;

Можете ли вы сказать мне, что вызывает проблему с частотой кадров и как ее исправить?

Или вы можете порекомендовать какие-либо другие решения для разделения цикла рендеринга и игровой логики?

6
задан Nicol Bolas 27 October 2011 в 18:57
поделиться