【问题标题】:Only Evaluates as True when Thread Sleeps仅在线程休眠时评估为真
【发布时间】:2016-05-14 11:16:56
【问题描述】:

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

所以我的问题是,为什么内部循环只有在 'this_thread::sleep_for(1s)' 未注释时才评估为真?无论 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);
}

感谢您的帮助!

【问题讨论】:

    标签: c++ while-loop boolean double game-loop


    【解决方案1】:

    您正在尝试使用clock() 来测量时间,但这是一个进程计时计数器,当您的进程中的所有线程都处于休眠状态时,它不会前进。 sleep 的全部意义在于告诉 CPU“暂时不要关注这个进程!”。就您的程序而言,时间会在它处于睡眠状态时冻结。

    如果您等待的时间足够长,lagTime 最终会超过 fixedDeltaTime,因为您的程序休眠的时间段会消耗滴答声……但您必须等待很多很多秒。

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

    【讨论】:

    • 谢谢。我没有意识到这一点。我将 clock() 切换为使用 SDL 函数 SDL_GetTicks() 并解决了这个问题。是否有 C++ 标准方法来获取绝对时间?谢谢!
    • @leaflet757:仅当您的编译器足够新时stackoverflow.com/a/26651148/560648
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2010-12-08
    • 2011-09-18
    相关资源
    最近更新 更多