线程睡眠时只评估为真
问题描述:
我收到一些意想不到的行为,我不明白。我试图按照http://gafferongames.com/game-physics/fix-your-timestep/和http://gameprogrammingpatterns.com/game-loop.html的描述实现一个固定的可变时间步长。当我在Visual Studio中运行程序时,我的inner 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);
}
谢谢你的帮助!
答
你试图测量使用clock()
时间,但这是但你在进程中的所有线程都在睡觉,不会推进的过程节拍计数器。 sleep
的全部要点是告诉CPU“暂时不要给这个过程任何注意!”。就你的程序而言,时间在睡着时冻结。
如果你等待足够长的时间,lagTime
最终将推动过去fixedDeltaTime
因为时间的期间,你的程序是不睡眠消耗滴答......但你必须要等待很多很多秒。
请勿使用clock()
来衡量绝对的时间流逝。
谢谢。我没有意识到这一点。我将clock()切换到使用SDL函数SDL_GetTicks()并解决了问题。 有没有一种C++标准的方法来获得绝对时间?谢谢! – leaflet757
@ leaflet757:仅当您的编译器足够新时http://stackoverflow.com/a/26651148/560648 –