Я использую OpenGL ES для создания игры на iPhone. К сожалению, я вижу небольшую (и нерегулярную) икоту.
Я использую таймер со сном, вызывая функцию отрисовки каждые 60 секунд, чтобы гарантировать стабильную частоту кадров. Я попытался изменить момент времени, когда мой таймер пробуждается от сна, давая функции рисования больше времени для выполнения. Икоты становятся меньше, когда функции рисования уделяется больше времени. С 8 миллисекундами анимация почти плавная. Мои выводы:
- По-видимому, предоставление графическому процессору большего времени для выполнения фактического рисования приводит к (почти) идеальной плавной анимации.
- Рисование точно в конце моего кадра приводит к заиканию, икоте и тому подобному.
Теперь, когда я это знаю, я не знаю, что делать дальше. У меня есть две противоречивые идеи о причине такого поведения:
- Во-первых, могут ли команды 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];
}