我正在尝试实现固定的时间步长循环,以便游戏以恒定速率刷新。我在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玩家位置之间进行插值。
另外,我意识到我需要一个更准确的计时器。
答案 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相结合来获得速度。显然这是一个非常简单的解释,但如果你愿意的话,那里有大量的参考文献和更多细节。