我正在使用 OpenGL ES 在 iPhone 上制作游戏。不幸的是,我看到了小的(和不规则的)打嗝。
我使用带睡眠的计时器,每 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];
}