如何调整游戏循环帧率?

时间:2013-08-05 18:20:27

标签: c++ sfml frame-rate

我正在尝试使用SFML编程我的第一个游戏(以及我的第一个整体游戏),但我遇到了一个问题,我每秒钟都会出现口吃。在这样的口吃期间,Frametime比正常情况高3到4倍,这是非常明显的,因为我没有运行真正高的FPS(300+)。

没有问题(至少是atm)因为性能不是问题,但是:

当我这样做的时候,我的运动方法真的很吓人,并且移动的方式比它应该做的慢。

我的运动方法:

void Player::Update(float frametime){
    mMovementSpeedTimefactor = frametime * 60 / 1000.0f;

    setMovementVector(sf::Vector2f( mMovementVector.x * mMovementSpeedTimefactor, mMovementVector.y *mMovementSpeedTimefactor));
    validateMovement();
    //std::cout << mTestClock->restart().asMilliseconds() << std::endl;

    moveObject();
    this->updateAnimation();
}

frametime是以毫秒为单位的帧时间,i乘以60,因为我的movingpeed设置为像素/秒的值而不是每帧。

movespeed是5,因此角色应该每秒移动5 px,无论FPS(以及因此的帧时间)我都有。

但是:这给了我真正的跳跃运动,因为那些“stutterframes”导致跳跃,而在nto口吃框架上,palyer移动的速度比它应该慢得多。

我的主循环很简单,只是

while(mMainWindow->isOpen()){

        HandleEvents();
        Update();
        Render();
    }

虽然使用inbuild framelimiter(尝试编写我自己的,但我得到了相同的结果,只要我使用sf:sleep来调节FPS,因为没有cpu核心以100%负载运行)到300 FPS。

所以是的,我可以将标准速度设置为1而不是5,但是  setframeratelimit不是很准确,所以我得到了一些变速,我真的不喜欢。

任何人都有一个想法,我最能做什么?也许我没有看到所有树木的森林(我实际上不知道你是否用英语说:P)但是因为这是我的第一场比赛,我没有经验可以回顾。

2 个答案:

答案 0 :(得分:2)

类似的问题:Movement Without Framerate Limit C++ SFML

您真正需要的是固定时间步骤。 看一下SFML游戏开发书籍source code。以下是来自Application.cpp的有趣摘录:

    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();
    }

编辑:如果这不是您想要的,请参阅“Fix your timestep!”Laurent Gomila自己在SFML论坛中链接的内容。

答案 1 :(得分:1)

frametime非常高或非常低时,由于浮点精度问题,您的计算可能无法正常工作。我建议将标准速度设置为500mMovementSpeedTimeFactorframetime * 60 / 10.0f并检查问题是否仍然存在。