2

我目前正在尝试用 SFML 编写我的第一个游戏(也是我的第一个整体游戏),但我遇到了一个问题,即我每秒会出现一次口吃。在这种口吃期间,帧时间比正常情况高 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 是以毫秒为单位的帧时间,我乘以 60,因为我的移动速度设置为像素/秒而不是每帧的值。

移动速度是 5,所以角色应该每秒移动 5 像素,无论我有什么 FPS(以及帧时间)。

但是:这给了我非常跳跃的动作,因为那些“口吃帧”会导致跳跃,并且在 nto 口吃帧上,palyer 的移动速度比它应该慢得多。

我的主循环很简单,只是

while(mMainWindow->isOpen()){

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

在使用内置帧限制器时(尝试编写我自己的,但我得到了完全相同的结果,只要我使用 sf:sleep 来调节 FPS 以使 cpu 核心不以 100% 负载运行)到 300 FPS。

所以是的,我可以将我的标准速度设置为 1 而不是 5,但是 setframeratelimit 不是很准确,所以我的移动速度有些变化,我真的不喜欢。

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

4

2 回答 2

2

类似的问题:Moving without Framerate Limit C++ SFML

你真正需要的是固定的时间步长。看看SFML游戏开发书源代码这是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();
    }

编辑:如果这不是您真正想要的,请参阅Laurent Gomila 本人在 SFML 论坛中链接的“修复您的时间步长! ”。

于 2013-09-17T10:38:19.657 回答
1

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

于 2013-08-07T23:25:52.110 回答