这让我发疯,无论如何,通常的故事,试图保证我非常简单的游戏在运行它的任何 Windows 机器上具有相同的速度。我通过指定一个 1/60 的值来做到这一点,然后确保 fram 不能运行,直到该值自上次调用以来及时过去。由于某种原因,我遇到的问题是 1/60 等于 30hz,我必须将其设置为 1/120 才能获得 60hz。它也不会在 60hz 上爆炸,它会快一点。
如果我把它贴在这里,如果有人发现有什么不对,可以告诉我吗?或者更精确的方法?
float controlFrameRate = 1./60 ;
while (gameIsRunning)
{
frameTime += (system->getElapsedTime()-lastTime);
lastTime = system->getElapsedTime();
if(frameTime > controlFrameRate)
{
gameIsRunning = system->update();
//do stuff with the game
frameTime = .0f;
}
}
最佳答案
不要调用 getElapsedTime
两次,两次调用之间可能会有细微差别。相反,存储它的值(value),然后重用它。此外,不是将 frameTime 设置为 0,而是从中减去 controlFrameRate,这样一来,如果一帧花费的时间稍长,下一帧将通过缩短一点来弥补。
while (gameIsRunning)
{
float elapsedTime = system->getElapsedTime();
frameTime += (elapsedTime-lastTime);
lastTime = elapsedTime;
if(frameTime > controlFrameRate)
{
gameIsRunning = system->update();
//do stuff with the game
frameTime -= controlFrameRate;
}
}
我不确定您必须将速率设置为 1/120 的问题,您在这里使用的是什么计时 API?
关于c++ - 游戏循环帧率控制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10873740/