我收到一些我不了解的意外行为。我正在尝试实现一个固定的可变时间步长,如http://gafferongames.com/game-physics/fix-your-timestep/http://gameprogrammingpatterns.com/game-loop.html中所述。当我在Visual Studio中运行程序时,我的内部while循环永远不会评估为true;但是,当我取消注释'this_thread :: sleep_for(1s)'时,在外循环执行10次左右之后,while循环将评估为true。我希望在更快的计算机上,这将是预期的结果。

所以我的问题是,为什么在未注释'this_thread :: sleep_for(1s)'时,内部循环为什么会评估为true?不管sleep_for,lagTime是否不应该大于fixedDeltaTime吗?数学会花费太多时间给计算机还是其他东西?

int updateCount = 0;

double CLOCKS_PER_MILLISECOND((double)CLOCKS_PER_SEC * 1000.0);
double previousTime = std::clock() / CLOCKS_PER_MILLISECOND;
double newTime = 0, deltaTime = 0, lagTime = 0;
double fixedDeltaTime = 1.0 / 60.0;

while (gameIsRunning)
{
    newTime = std::clock() / CLOCKS_PER_MILLISECOND;
    deltaTime = newTime - previousTime;
    previousTime = newTime;
    lagTime += deltaTime;

    inputSystem.update();
    sceneManager.update();

    while(lagTime >= fixedDeltaTime) // never evalutes as true?
    {
        physicsSystem.update();

        lagTime -= fixedDeltaTime;

        updateCount++;
    }

    std::cerr << "-----" << updateCount << "-----" << std::endl;

    physicsSystem.interpolate(lagTime / fixedDeltaTime);

    renderSystem.update();
    audioSystem.update();

    updateCount = 0;
    //std::this_thread::sleep_for(1s);
}


感谢您的任何帮助!

最佳答案

您正在尝试使用clock()来测量时间,但这是一个进程滴答计数器,当进程中的所有线程处于休眠状态时,计数器不会增加。 sleep的全部要点是告诉CPU“暂时不要对此进程给予任何注意!”。就您的程序而言,时间会在其休眠时冻结。

如果您等待了足够长的时间,lagTime最终将超过fixedDeltaTime,因为程序不处于睡眠状态的时间段会消耗滴答声……但是您必须等待很多秒。

不要使用clock()来测量绝对时间的流逝。

关于c++ - 仅在线程休眠时评估为True,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35207884/

10-10 13:28