3

我正在尝试实现一个固定的时间步长循环,以便游戏以恒定的速率刷新。我在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 玩家位置之间进行插值。

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

4

3 回答 3

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;
    }
}
于 2013-07-06T18:48:45.597 回答
0

见: http ://en.wikipedia.org/wiki/Integral & http://en.wikipedia.org/wiki/Numerical_integration

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

于 2012-05-07T04:01:52.037 回答
-3

你应该复习你的高中物理。简单地说,速度是距离随时间变化的变化(dxdt),加速度是速度随时间变化的变化(dvdt)可以通过对 t 积分得到速度。显然,这是一个非常简单的解释,但是如果您愿意的话,有大量的参考资料可以提供更多的细节。

于 2012-05-07T04:08:38.770 回答