5

我现在正在用 SFML 制作游戏,但我在没有帧速率限制的情况下被卡住了。现在,我想出如何在所有计算机上获得一致帧速率的唯一方法是使用

window.setFramerateLimit(30);

我想找到一种不设置帧速率上限的方法,这样它在更好的电脑上看起来会更好,这样如果有人的电脑很慢,他们仍然可以玩游戏。什么是最好的方法来做到这一点。

4

2 回答 2

7

您应该将自上一帧以来经过的时间传递给需要绘制的对象,然后计算对象必须移动的空间,如下所示:

sf::Clock clock;
int speed = 300;


//Draw func that should be looped
void Draw()
{
    sf::Time elapsedTime = clock.restart();
    float tempSpeed = elapsedTime.asSeconds() * speed;
    drawnObject.move(tempSpeed, 0);
    drawnObject.draw(window);
}

这样,“drawnObject”将每秒向右移动 300(像素?),而不管 FPS

于 2013-08-19T18:45:02.853 回答
6

@Waty 的答案是正确的,但您可能想使用固定时间步长。

看看SFML游戏开发书源代码。这是有趣的片段

const sf::Time Game::TimePerFrame = sf::seconds(1.f/60.f);

// ...

sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
while (mWindow.isOpen())
{
    sf::Time elapsedTime = clock.restart();
    timeSinceLastUpdate += elapsedTime;
    while (timeSinceLastUpdate > TimePerFrame)
    {
        timeSinceLastUpdate -= TimePerFrame;

        processEvents();
        update(TimePerFrame);

    }

    updateStatistics(elapsedTime);
    render();
}
于 2013-09-17T10:32:44.633 回答