在OpenGL ES中打嗝。什么是正确的实施?
-
08-07-2019 - |
题
我正在使用OpenGL ES在iPhone上制作游戏。 不幸的是,我看到小的(和不规则的)打嗝。
我使用带睡眠的计时器,每隔60秒调用一次绘图功能,以保证稳定的帧速率。我试图改变我的计时器从睡眠中唤醒的时刻,给予绘制功能更多的时间来执行。一旦绘制函数被赋予更多时间,打嗝确实会减少。在8毫秒的时间内,动画几乎是流畅的。我的发现是:
- 显然让GPU有更多时间来执行实际绘图,从而产生(几乎)完美的流体动画。
- 在我的框架的确切结束处绘制导致口吃,打嗝和什么不是。 醇>
- 首先,可能是OpenGL命令干扰了前一帧的绘制吗?据我所知,由于命令是存储的,因此不会出现这种情况,只会在执行时执行给出了draw命令。
- 其次,绘制命令的波动时间是否会导致计时器跳过勾号? 醇>
现在我知道了,我不确定如何继续。关于这种行为的原因我有两个矛盾的想法:
那么哪种解释更有可能?或者不是?当然我可以尝试将绘图功能放在一个单独的线程中,看看是否能解决我的问题。但我希望能够更多地了解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];
}
解决方案
不隶属于 StackOverflow