1

我正在使用 OpenGL ES 在 iPhone 上制作游戏。不幸的是,我看到了小的(和不规则的)打嗝。

我使用带睡眠的计时器,每 60 秒调用一次绘图函数,以保证稳定的帧速率。我试图改变定时器从睡眠中唤醒的时间,让绘图函数有更多时间执行。一旦给绘图功能更多时间,打嗝就会减少。8 毫秒,动画几乎是流畅的。我的发现是:

  1. 显然,给 GPU 更多时间来执行实际绘图,会产生(几乎)完美的流畅动画。
  2. 在我的框架的确切末端绘图会导致口吃、打嗝等等。

现在我知道了,我不确定如何进行。关于这种行为的原因,我有两个相互矛盾的想法:

  1. 首先,会不会是 OpenGL 命令干扰了前一帧的绘制?据我了解,情况并非如此,因为命令已存储并且仅在给出绘图命令时才会执行。
  2. 其次,绘图命令的波动时间会导致计时器跳过一个刻度吗?

那么哪种解释更有可能呢?或者两者都不是?当然,我可以尝试将绘图功能放在单独的线程中,看看是否能解决我的问题。但我希望更多地了解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];    
}
4

1 回答 1

1

您可能想阅读这篇关于游戏循环的文章,其中解释了很多。一般来说,最好的解决方案是在一个单独的线程内的无限循环中调用绘图例程(参见这个问题),并根据自上次更新以来经过的时间来更新底层游戏模型。这会给你流畅的动作。

编辑:至于“打嗝”的来源,它们可能与 OpenGL 无关。在 60 fps 时,我们说的是每帧 1/60 秒 ≈ 17 毫秒。这是一个很容易错过的紧凑计划,因为设备上正在运行其他进程。Safari 或 Mail.app 在后台唤醒,设备思考了一会儿,现在你的帧需要 30 毫秒甚至更多。如果您的模型期望完全稳定的帧速率,这很容易发现。解决方案是根据经过的实时更新模型,正如我在上面所写的。链接的文章彻底解释了这一切。

于 2009-05-07T15:19:08.993 回答