Iphone opengles中的Hiccups。什么是正确的实现?
我正在使用OpenGL ES在iPhone上制作一个游戏不幸的是,我看到小的(不规则的)打嗝。 我使用一个带睡眠的计时器,每60秒调用一次draw函数,以保证稳定的帧速率。我试图改变计时器从睡眠中醒来的时间,让draw函数有更多的时间执行。一旦draw函数被赋予更多的时间,打嗝的次数就会减少。在8毫秒内,动画几乎是流动的。我的发现是:Iphone opengles中的Hiccups。什么是正确的实现?,iphone,optimization,opengl-es,Iphone,Optimization,Opengl Es,我正在使用OpenGL ES在iPhone上制作一个游戏不幸的是,我看到小的(不规则的)打嗝。 我使用一个带睡眠的计时器,每60秒调用一次draw函数,以保证稳定的帧速率。我试图改变计时器从睡眠中醒来的时间,让draw函数有更多的时间执行。一旦draw函数被赋予更多的时间,打嗝的次数就会减少。在8毫秒内,动画几乎是流动的。我的发现是: 显然,给GPU更多的时间来执行实际的绘图,会产生(几乎)完美的流体动画 在画框的最后画画会导致口吃、打嗝等等 现在我知道了,我不知道如何继续。关于这种行为的原因,
- (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];
}
你可能想读这篇文章,这解释了很多。一般来说,最好的解决方案是在一个单独线程内的无限循环中调用draw例程(请参见),并根据上次更新后经过的时间更新底层游戏模型。这将给你平稳的运动
编辑:至于“打嗝”的来源,它们可能与OpenGL无关。以每秒60帧的速度,我们说的是1/60秒≈ 每帧17毫秒。这是一个很紧的时间表,很容易错过,因为设备上还有其他进程在运行。Safari或Mail.app在后台唤醒,设备会思考一段时间,现在你的帧需要30毫秒甚至更长时间。如果您的模型期望完全稳定的帧速率,则很容易发现这一点。解决方案是根据经过的实时时间更新模型,正如我在上面所写的。链接的文章对此进行了详尽的解释。您可能想阅读这篇文章,这篇文章解释了很多。一般来说,最好的解决方案是在一个单独线程内的无限循环中调用draw例程(请参见),并根据上次更新后经过的时间更新底层游戏模型。这将给你平稳的运动
编辑:至于“打嗝”的来源,它们可能与OpenGL无关。以每秒60帧的速度,我们说的是1/60秒≈ 每帧17毫秒。这是一个很紧的时间表,很容易错过,因为设备上还有其他进程在运行。Safari或Mail.app在后台唤醒,设备会思考一段时间,现在你的帧需要30毫秒甚至更长时间。如果您的模型期望完全稳定的帧速率,则很容易发现这一点。解决方案是根据经过的实时时间更新模型,正如我在上面所写的。链接文章对此进行了详尽的解释。不客气。在iPhone()的Cocos2D引擎中也有一些好主意,特别是如果你正在做2D.I am。我来看看。再次感谢!不客气。在iPhone()的Cocos2D引擎中也有一些好主意,特别是如果你正在做2D.I am。我来看看。再次感谢!