移动时稍有暂停/延迟

时间:2014-04-14 22:27:26

标签: c++ sfml

我今天一直在为我的游戏制作这个小框架,并意识到移动时的移动延迟。我之前使用过SFML并遇到过同样的问题,但从来没有费心去解决它。我想知道是否有人有类似的问题,并找到了解决方案。

这是一个代码示例,它让我稍微停顿一下:

int main(){
    sf::RenderWindow window (sf::VideoMode(640, 480), "Window");
    //window.setVerticalSyncEnabled(true);

    sf::Texture tex;
    tex.loadFromFile("Assets/Textures/player.png");
    sf::Sprite s;
    s.setTexture(tex);

    while (window.isOpen()){
        sf::Event event;

        while (window.pollEvent(event)){
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            s.move(0.01f, 0.0f);
        }

        window.clear();
        window.draw(s);
        window.display();
    }
}

延迟/暂停/无论我经历的是什么都非常轻微但我能注意到它并且它真的让我烦恼。当没有任何值改变时,只看到轻微的运动中断使我的编程思想非常悲伤。

2 个答案:

答案 0 :(得分:1)

键盘输入会有延迟,就像在Microsoft Word中按住键一样。为了解决这个问题,您可以创建一个变量,并在按下某个键时将其设置为true。

int main(){
    sf::RenderWindow window (sf::VideoMode(640, 480), "Window");
    //window.setVerticalSyncEnabled(true);

    sf::Texture tex;
    tex.loadFromFile("Assets/Textures/player.png");
    sf::Sprite s;
    s.setTexture(tex);

    bool moving = false;

    while (window.isOpen()){
        sf::Event event;

        while (window.pollEvent(event)){
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            moving = true;
        }

        if (moving) {
            s.move(0.01f, 0.0f);
        }

        window.clear();
        window.draw(s);
        window.display();
    }
}

答案 1 :(得分:0)

这听起来像是帧率/时间问题。 60hz游戏中的一帧是16.666毫秒,但至少在Windows上,系统时钟只有1ms的分辨率,所以你的延迟将是16ms或17ms。这种不准确会导致偶尔的抖动,因为有些帧被跳过(或者在你的情况下呈现两次,即使启用了vsync也会出现短暂停顿)。

如果您可以手动控制帧定时,例如通过禁用sf::RenderWindow的帧速率限制并直接调用sf::sleep,一种解决方案是延迟序列中的每一帧:17,17,16,17,17,16,以便长 - 平均值接近60hz,最大限度地减少了抖动。

我从未使用过SFML,因此我无法提供任何代码,但我希望这能为您指明正确的方向。

您还应确保您的显示器刷新率与游戏的帧速率相同。 SFML可能已经自动执行此操作。