C++ C+中的固定时间步循环+;
我试图实现一个固定的timestep循环,以便游戏以恒定的速率刷新。我在上找到了一篇很棒的文章,但在将其翻译成我自己的2d引擎时遇到了麻烦 我指的是最后一部分“最终触摸”中的功能,这是大多数人推荐的功能。这是他的职责:C++ C+中的固定时间步循环+;,c++,C++,我试图实现一个固定的timestep循环,以便游戏以恒定的速率刷新。我在上找到了一篇很棒的文章,但在将其翻译成我自己的2d引擎时遇到了麻烦 我指的是最后一部分“最终触摸”中的功能,这是大多数人推荐的功能。这是他的职责: double t = 0.0; const double dt = 0.01; double currentTime = hires_time_in_seconds(); double accumulator = 0.0; State prev
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玩家位置之间插值
此外,我意识到我需要一个更精确的计时器。请参阅:
&
函数是一种近似积分函数的数值技术(第二个环节)。你应该复习高中物理。简单地说,速度是距离随时间变化的变化(dxdt),加速度是速度随时间变化的变化(dvdt)。如果你知道dxdt,你可以通过积分它与t的关系得到距离,如果你知道dvdt,你可以通过积分它与t的关系得到速度。显然,这是一个非常简单的解释,但如果您愿意,这里有大量的参考资料和更多的细节。如果您能够获得至少微秒的精度,请尝试以下方法:
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;
}
}
该功能是为用户提供的。你好像在问一个计时器事件。这两件事彼此无关。@chrisaycock很抱歉搞混了。问题更新。对不起,我更新了我的问题。我措辞不好。我想知道主函数是如何使用时间和增量时间的,以及我将如何将其应用到具有x和y位置的2d播放器的移动中。我仍然建议您重温高中物理,只要您有适当的数学背景,一个小时就足够了。我没有代码,所以我不能告诉你“集成”到底做了什么,但我猜它会更新当前状态,根据时间段dt中对象的加速度和速度重新计算一个新位置。(你计算距离的方法是速度对时间的积分,你计算速度的方法是加速度对时间的积分,这可能就是他在这段代码中所做的。)抱歉,我更新了我的问题。我的措辞很糟糕。我想知道主要功能是如何使用时间和增量时间的,以及我将如何将其应用到具有x和y位置的2d播放器的移动中。@chrisaycock我不同意。它回答了最初陈述的问题。另外,所以不让我发表评论-仅回答。@JonathanLeonard:answers只包含链接是不可取的。你需要提供一个真实的答案,并使用链接作为参考来支持你的主张或提供进一步的解释。@MatthieuM。你看到解释链接是什么的第二句了吗?@JonathanLeonard:我看到了。我发现它有点短。对你来说显而易见的东西可能不适用于OP,否则就不会有了我本来就不是个问题。