当前位置: 首页 > 知识库问答 >
问题:

仅在线程Hibernate时计算为True

应俊爽
2023-03-14

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

所以我的问题是,为什么只有当this_thread::sleep_for(1s)未被注释时,内部循环才会被评估为true?不管sleep_for如何,lagTime不应该变得比固定的DeltaTime更大吗?数学会花太多时间在电脑上吗?

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);
}

谢谢你的帮助!

共有1个答案

龙隐水
2023-03-14

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

如果你等待的时间足够长,lagTime最终会超过固定的DeltaTime,因为你的程序不睡觉的时间会消耗时间...但是你必须等待很多很多秒。

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

 类似资料:
  • 为什么单线程和多线程脚本具有相同的处理时间?多线程实现不是应该少1/#线程数吗?(我知道当您达到最大cpu线程时,回报会递减) 我搞砸了我的实现吗?

  • 在求树的直径时,我们考虑以下最大值: 1:左子树的直径 2:右子树的直径 3:左子树高度右子树高度1. 为什么这三个是必要的?为什么是3。光靠自己是不够的。让我们看一个简单的3节点树和2节点树的例子。在前一个例子中,仅第3点就给出了1=3。而在后一种情况下,仅第3点就给出0 1=2。 在这种情况下,为什么我们需要找到三的最大值。请解释

  • 我有一个聚合函数,它计算WindowedStream中一系列事件的平均值。 这里的警告是,平均值需要在可能无序(或根本没有)到达的事件对上计算。 换句话说,我需要在计算之前对数据进行排序,因为序列很重要。 我可以用getResult API来实现这一点,但是这个函数在窗口中的每个事件上都被调用,这在性能方面没有意义。我也可以用flink cep来做这件事,但出于同样的原因,我想避免使用它。 理想情

  • 我正在http://www.python-course.eu/threads.php的帮助下学习python线程处理。这段代码的解释让我很困惑: 代码: 读取num_thread的值 一个新的int实例将增加或减少1(我认为一个新的int对象将被创建) 将新值分配给num_threads 像这样的错误发生在增量赋值的情况下: 第一个线程读取变量num_threads,它的值仍然是0。令人困惑的是:

  • null 当工作线程处理消息时,如果处理时间超过5分钟,我希望生成一条警告消息,但仍然让工作线程继续处理。 问题 我希望不断检查工作线程是否超过了5分钟的消息处理时间,如果超过了阈值时间,那么我希望记录一条错误消息,但仍然让工作线程按原样继续。 工人阶层