1

无论如何,这让我发疯了,通常的故事,试图保证在我的非常简单的游戏中在任何运行它的 Windows 机器上都具有相同的速度。我通过指定 1/60 值来做到这一点,然后确保框架无法运行,直到该值自上次调用以来及时通过。由于某种原因,我遇到的问题是 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;                   
    }
} 
4

1 回答 1

3

不要调用getElapsedTime两次,两次调用可能会有细微差别。相反,存储它的值,然后重用它。此外,不要将 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?

于 2012-06-03T20:43:29.720 回答