Iphone opengles中的Hiccups。什么是正确的实现?

Iphone opengles中的Hiccups。什么是正确的实现?,iphone,optimization,opengl-es,Iphone,Optimization,Opengl Es,我正在使用OpenGL ES在iPhone上制作一个游戏不幸的是,我看到小的(不规则的)打嗝。 我使用一个带睡眠的计时器,每60秒调用一次draw函数,以保证稳定的帧速率。我试图改变计时器从睡眠中醒来的时间,让draw函数有更多的时间执行。一旦draw函数被赋予更多的时间,打嗝的次数就会减少。在8毫秒内,动画几乎是流动的。我的发现是: 显然,给GPU更多的时间来执行实际的绘图,会产生(几乎)完美的流体动画 在画框的最后画画会导致口吃、打嗝等等 现在我知道了,我不知道如何继续。关于这种行为的原因,

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

我使用一个带睡眠的计时器,每60秒调用一次draw函数,以保证稳定的帧速率。我试图改变计时器从睡眠中醒来的时间,让draw函数有更多的时间执行。一旦draw函数被赋予更多的时间,打嗝的次数就会减少。在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];    
    }
    

    你可能想读这篇文章,这解释了很多。一般来说,最好的解决方案是在一个单独线程内的无限循环中调用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。我来看看。再次感谢!