我目前正在制作一款小型游戏机。在游戏循环结束时,另一个循环在迭代的开始时间之后不会释放到1/100。
当然占用了大量的CPU,所以我放了
Sleep(1);
最后解决它。我认为一切都是正确的,直到我在2005年的XP笔记本电脑上运行游戏......而且它真的很慢。
当我删除Sleep命令时,游戏在两台计算机上运行良好,但现在我遇到了CPU使用问题。
有没有人有这方面的好解决方案?
答案 0 :(得分:0)
您应该在标题<thread>
中使用std::this_thread::sleep_for
以及std::chrono
内容。也许是这样的:
while(...)
{
auto begin = std::chrono::steady_clock::now();
// your code
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
std::this_thread::sleep_for(std::chrono::milliseconds(10) - duration);
}
如果你的代码在一次迭代中没有花费太多时间,或者如果每次迭代都需要恒定的时间,那么你可以单独留下测量结果,只需要保持一定的常数:
std::this_thread::sleep_for(std::chrono::milliseconds(8));
答案 1 :(得分:0)
听起来像旧笔记本电脑只需要更多时间来完成所有过程,然后它会睡眠1毫秒。
你应该包括一个告诉时间的图书馆, 获取程序开始时的当前时间/循环开始,然后在循环/程序结束时将开始时间和当前时间的差异与您想要的时间进行比较。如果它低于你想要的时间(比如8毫秒),告诉它睡觉最小时间 - currentTime - recordedTime(你在循环开始时设置的变量)
我已经在SDL2中为自己的游戏做了这个,SDL_GetTicks()只找到程序运行的毫秒数,“ frametime ”是主游戏开始时的时间环。这就是我让游戏以最高60fps运行的方式。应修改此if语句并将其放在程序的底部。
if( SDL_GetTicks() - frametime < MINFRAMETIME )
{
SDL_Delay( MINFRAMETIME - ( SDL_GetTicks() - frametime ) );
}
我认为标准库等价物是:
if( clock() - lastCheck < MIN_TIME )
{
sleep( MIN_TIME - ( clock() - lastCheck ) );
}