仅在线程休眠时评估为真
Only Evaluates as True when Thread Sleeps
我遇到了一些我不理解的意外行为。我正在尝试实现 http://gafferongames.com/game-physics/fix-your-timestep/ and http://gameprogrammingpatterns.com/game-loop.html 中描述的固定可变时间步长。当我 运行 visual studio 中的程序时,我的内部 while 循环永远不会评估为真;然而,当我取消注释 'this_thread::sleep_for(1s)' 时,while 循环将在外循环执行 10 次左右后评估为 true。我希望在更快的机器上,这将是预期的结果。
所以我的问题是,为什么只有当 '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);
}
感谢您的帮助!
您正在尝试使用 clock()
来测量时间,但这是一个进程滴答计数器,当您进程中的所有线程都处于休眠状态时,它不会前进。 sleep
的全部意义在于告诉 CPU "don't give this process any attention for a while!"。就您的程序而言,时间在睡眠时冻结。
如果您等待的时间足够长,lagTime
最终会超过 fixedDeltaTime
,因为您的程序 未 休眠的时间段会消耗 ticks 。 .. 但是你必须等待很多很多秒。
不要用clock()
来衡量时间的绝对流逝。
我遇到了一些我不理解的意外行为。我正在尝试实现 http://gafferongames.com/game-physics/fix-your-timestep/ and http://gameprogrammingpatterns.com/game-loop.html 中描述的固定可变时间步长。当我 运行 visual studio 中的程序时,我的内部 while 循环永远不会评估为真;然而,当我取消注释 'this_thread::sleep_for(1s)' 时,while 循环将在外循环执行 10 次左右后评估为 true。我希望在更快的机器上,这将是预期的结果。
所以我的问题是,为什么只有当 '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);
}
感谢您的帮助!
您正在尝试使用 clock()
来测量时间,但这是一个进程滴答计数器,当您进程中的所有线程都处于休眠状态时,它不会前进。 sleep
的全部意义在于告诉 CPU "don't give this process any attention for a while!"。就您的程序而言,时间在睡眠时冻结。
如果您等待的时间足够长,lagTime
最终会超过 fixedDeltaTime
,因为您的程序 未 休眠的时间段会消耗 ticks 。 .. 但是你必须等待很多很多秒。
不要用clock()
来衡量时间的绝对流逝。