游戏时钟和睡眠(C ++)

时间:2015-07-12 20:10:28

标签: c++ timer console clock

我目前正在制作一款小型游戏机。在游戏循环结束时,另一个循环在迭代的开始时间之后不会释放到1/100。

当然占用了大量的CPU,所以我放了

Sleep(1);

最后解决它。我认为一切都是正确的,直到我在2005年的XP笔记本电脑上运行游戏......而且它真的很慢。

当我删除Sleep命令时,游戏在两台计算机上运行良好,但现在我遇到了CPU使用问题。

有没有人有这方面的好解决方案?

2 个答案:

答案 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 ) );
}