修复了C ++中的时间步长循环

时间:2012-05-07 03:59:39

标签: c++

我正在尝试实现固定的时间步长循环,以便游戏以恒定速率刷新。我在http://gafferongames.com/game-physics/fix-your-timestep/发现了一篇很棒的文章,但是在将其翻译成我自己的2D引擎时遇到了麻烦。

我指的具体位置是最后一部分“The Final Touch”中的功能,这是大多数人推荐的。这是他的职责:

double t = 0.0;
    const double dt = 0.01;

    double currentTime = hires_time_in_seconds();
    double accumulator = 0.0;

    State previous;
    State current;

    while ( !quit )
    {
         double newTime = time();
         double frameTime = newTime - currentTime;
         if ( frameTime > 0.25 )
              frameTime = 0.25;   // note: max frame time to avoid spiral of death
         currentTime = newTime;

         accumulator += frameTime;

         while ( accumulator >= dt )
         {
              previousState = currentState;
              integrate( currentState, t, dt );
              t += dt;
              accumulator -= dt;
         }

         const double alpha = accumulator / dt;

         State state = currentState*alpha + previousState * ( 1.0 - alpha );

         render( state );
    }

对于我自己来说,我只是将玩家移动到屏幕上,跟踪x和y位置以及速度,而不是进行微积分整合。 **我对应用于更新玩家位置(dt或t?)的内容感到困惑。有人可以打破这个并进一步解释吗?

第二部分是我理解的插值,因为提供的公式是有意义的,我可以简单地在当前和之前的x,y玩家位置之间进行插值。

另外,我意识到我需要一个更准确的计时器。

3 个答案:

答案 0 :(得分:1)

如果你能获得至少微秒的准确度,试试这个:

long int start = 0, end = 0;
double delta = 0;
double ns = 1000000.0 / 60.0; // Syncs updates at 60 per second (59 - 61)
while (!quit) {
    start = timeAsMicro();
    delta+=(double)(start - end) / ns;
    end = start;

    while (delta >= 1.0) {
       doUpdates();
       delta-=1.0;
    }
}

答案 1 :(得分:0)

请参阅: http://en.wikipedia.org/wiki/Integral &安培; http://en.wikipedia.org/wiki/Numerical_integration

该函数是用于近似积分函数(第1个链接)的数值技术(第2个链接)。

答案 2 :(得分:-1)

你应该复习你的高中物理。简单地说,速度是距离随时间变化的变化(dxdt),加速度是速度随时间变化的变化(dvdt)如果你知道dxdt你可以通过将它与t相比得到距离,如果你知道dvdt你可以通过将其与t相结合来获得速度。显然这是一个非常简单的解释,但如果你愿意的话,那里有大量的参考文献和更多细节。