【问题标题】:SFML Game Development Book - Understanding FPS CalculationSFML 游戏开发书籍 - 了解 FPS 计算
【发布时间】:2014-09-21 14:42:46
【问题描述】:

这是我的第一篇文章,所以我希望我做对了。

我目前正在阅读 SFML 游戏开发手册。我试图了解介绍示例中 FPS 的计算方式。

我的游戏类如下所示:

#include "Game.h"

const sf::Time Game::TIME_PER_FRAME = sf::seconds(1.f/60.f);
const float Game::PLAYER_SPEED = 100.f;

Game::Game() : Window(sf::VideoMode(640,480), "ORGELLA") {        

    isMovingUp = false;
    isMovingDown = false;
    isMovingLeft = false;
    isMovingRight = false;

    Player.setRadius(40.f);
    Player.setPosition(100.f, 100.f);
    Player.setFillColor(sf::Color::Cyan);

    font.loadFromFile(resourcePath() + "sansation.ttf");
    statsText.setFont(font);
    statsText.setPosition(5.f, 5.f);
    statsText.setCharacterSize(10);
}

void Game::run() {
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;


    while (Window.isOpen()) {
        sf::Time dt = clock.restart();
        timeSinceLastUpdate += dt;

        while (timeSinceLastUpdate > TIME_PER_FRAME) {
            timeSinceLastUpdate -= TIME_PER_FRAME;

            handleEvents();
            update(TIME_PER_FRAME);
        }

        updateGameStats(dt);
        render();
    }
}

void Game::handleEvents() {
    sf::Event event;
    while (Window.pollEvent(event)) {
        switch (event.type) {
            case sf::Event::KeyPressed:
                handlePlayerInput(event.key.code, true);
                break;
            case sf::Event::KeyReleased:
                handlePlayerInput(event.key.code, false);
                break;
            case sf::Event::Closed:
                Window.close();
                break;
        }
    }
}

void Game::update(sf::Time dt) {
     sf::Vector2f movement(0.f, 0.f);

    if (isMovingUp)
        movement.y -= PLAYER_SPEED;
    if (isMovingDown)
        movement.y += PLAYER_SPEED;
    if(isMovingLeft)
        movement.x -= PLAYER_SPEED;
    if (isMovingRight)
        movement.x += PLAYER_SPEED;

    Player.move(movement * dt.asSeconds());
}

void Game::render() {
    Window.clear();
    Window.draw(Player);
    Window.draw(statsText);
    Window.display();
}

void Game::handlePlayerInput(sf::Keyboard::Key key, bool isPressed) {
    switch (key) {
        case sf::Keyboard::W:
            isMovingUp = isPressed;
            break;
        case sf::Keyboard::S:
            isMovingDown = isPressed;
            break;
        case sf::Keyboard::A:
            isMovingLeft = isPressed;
            break;
        case sf::Keyboard::D:
            isMovingRight = isPressed;
            break;
    }
}

void Game::updateGameStats(sf::Time dt) {
    statsTotalTimeElapsed += dt ;
    statsNumberOfFrames += 1;

    if (statsTotalTimeElapsed >= sf::seconds(1.0f)) {
        statsText.setString(
            "FPS = " + to_string(statsNumberOfFrames) + "\n" +
            "Time/Update = " + to_string(statsTotalTimeElapsed.asMicroseconds() / statsNumberOfFrames) + "us");

        statsTotalTimeElapsed -= sf::seconds(1.0f);
        statsNumberOfFrames = 0;
    }
}

现在,我的问题是这个。如何计算渲染到我的屏幕的 FPS。据我所知,FPS 的上限为 60fps,但是当我运行应用程序时,显示的 FPS 大约为 500 - 1200 FPS。

我是计算错了还是没有正确理解?

希望这个帖子没问题,我好像找不到类似的问题。

我们将不胜感激任何建议或帮助。

【问题讨论】:

    标签: c++ sfml frame-rate


    【解决方案1】:

    给定framerate(例如 60 FPS):

    auto framerate = 60; // FPS
    auto elapsedMillisecondsExpected = 1000 / framerate; // in milliseconds
    

    在 SFML 中,您使用 sf::Clock 并在每一帧都设置上限:

    sf::Clock clock;
    
    // frame logic
    
    auto elapsedMilliseconds = clock.getElapsedTime().asMilliseconds();
    if (elapsedMilliseconds < elapsedMillisecondsExpected) {
        auto sleepMilliseconds = elapsedMillisecondsExpected - elapsedMilliseconds;
        // sleep for sleepMilliseconds
    }
    

    【讨论】:

    • 您好,感谢您的回复。这是有道理的,但这不是当前游戏循环中发生的事情吗? TIME_PER_FRAME = framerate 并且第二个循环应该跟踪将其限制为 60FPS?再次感谢。
    【解决方案2】:

    想出了这个!我正在查看每秒运行的总帧数,而不是每秒更新的帧数。当我记录更新方法每秒运行多少次时,我得到稳定的 60FPS。

    感谢您的帮助。

    尼克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多