C++ C+中的固定时间步循环+;

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

我试图实现一个固定的timestep循环,以便游戏以恒定的速率刷新。我在上找到了一篇很棒的文章,但在将其翻译成我自己的2d引擎时遇到了麻烦

我指的是最后一部分“最终触摸”中的功能,这是大多数人推荐的功能。这是他的职责:

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,否则就不会有了我本来就不是个问题。