我得到一些我不明白的意外行为。我正在尝试实施固定变量时间步骤,如http://gafferongames.com/game-physics/fix-your-timestep/和http://gameprogrammingpatterns.com/game-loop.html所述。当我在visual studio中运行程序时,我的内部while循环永远不会评估为true;但是,当我取消注释'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);
}
感谢您的帮助!
答案 0 :(得分:2)
您正在尝试使用clock()
来衡量时间,但这是一个进程计数器计数器,当您的进程中的所有线程都处于休眠状态时,它不会前进。 sleep
的重点是告诉CPU“暂时不要给这个过程注意!”。就你的程序而言,时间会在睡着时冻结。
如果您等了足够长的时间,lagTime
最终会超过fixedDeltaTime
,因为您的程序不睡觉的时间段会消耗滴答声......但是你'我必须等待许多秒钟。
请勿使用clock()
来衡量绝对时间的流逝。