仅在线程休眠时计算为 true

Only Evaluates as True when Thread Sleeps

本文关键字:计算 true 休眠 线程      更新时间:2023-10-16

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

所以我的问题是,为什么内部循环只有在未注释"this_thread::sleep_for(1s)"时才评估为真?无论sleep_for如何,滞后时间不应该大于固定增量时间吗?数学是否花费了太多时间用于计算机或其他东西?

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()来衡量时间的绝对流逝。