仅在线程休眠时计算为 true
Only Evaluates as True when Thread Sleeps
我遇到了一些我不明白的意外行为。我正在尝试实现一个固定的可变时间步长,如 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()
来衡量时间的绝对流逝。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 我正在尝试创建一个布尔函数,该函数计算字符并在字符为"()*-+"时返回 true
- 计算 <Classtype*> 向量中所有项的布尔值的最有效方法,如果全部为真则返回 true
- GetAsyncKeyState(VK_RETURN) 错误地计算为 true
- (a==1)&&(a==2)&&(a==3) 的计算结果为 true 吗?(它有用吗?
- "if"条件的计算结果始终为 "true"
- if 语句在应该计算 TRUE 时不计算 TRUE
- 而循环在为假时计算为 true C++
- 仅在线程休眠时计算为 true
- 为什么这个 while 循环永远不会计算为 true
- Qt 编译错误:endl 将始终计算为 true
- ifstream.eof() 在 C++ 中未计算为 true
- 相等性的预处理器测试总是计算为true
- Address将始终计算为true error
- Static_assert总是计算true (avr, g++)