Я использую OpenGL ES, чтобы сделать игру на iPhone. К сожалению, я вижу небольшие (и нерегулярные) икоты.Икота в OpenGL ES. Какая правильная реализация?
Я использую таймер со сном, вызывая функцию ничьей каждые 60 секунд, чтобы обеспечить стабильную частоту кадров. Я попытался изменить момент времени, когда мой таймер пробуждается от сна, давая функции рисования больше времени для выполнения. Икоты получают меньше, когда функция ничьей получает больше времени. С 8 миллисекундами анимация почти текучая. Мои выводы:
- Очевидно, что GPU больше времени для выполнения фактического чертежа, приводит к (почти) идеальной жидкостной анимации.
- Рисунок в точном конце моего кадра приводит к заиканию, икоту, а что нет.
Теперь, когда я это знаю, Я не уверен, как действовать. Я две противоречащие идеи о причине такого поведения:
- Во-первых, это может быть, что команды OpenGL мешают чертежа предыдущего кадра? Насколько я понимаю, это не так, поскольку команды хранятся и будут выполняться только при задании команды рисования.
- Во-вторых, может ли колебательное время команд ничьей заставить таймер пропустить галочку?
Какое объяснение более вероятно? Или нет? Конечно, я мог бы просто попытаться поместить функцию ничьи в отдельную нить и посмотреть, решает ли она мою проблему. Но я надеюсь понять больше OpenGL.
Эта функция вызывается, и объясняет, что я везу о:
- (void) drawView
{
// measure time with mach_absolute_time
// gameEngine update
// OpenGL commands (translate, rotate, drawArrays etc.)
// end measure time with mach_absolute_time
// usleep(animationInterval - duration - constant)
// constant is the time to start executing
// draw
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
Спасибо! Это очень помогло. :) – Kriem
Добро пожаловать. Есть также хорошие идеи в движке Cocos2D для iPhone (http://tinyurl.com/5hpjba), особенно если вы делаете 2D. – zoul
Я. Вы проверите это. Еще раз спасибо! – Kriem