在过去的一周中,我一直在做游戏的核心,我碰壁了,因为渲染根本不够好。运动很生涩,我流泪了,总体上有很多滞后。我以为这可能不是我的游戏引擎的错,所以我用一个非常简单的游戏循环测试了渲染:

        sf::RenderWindow window(sf::VideoMode(1024, 768), "Testing");
                window.setVerticalSyncEnabled(true);
        sf::Clock clock;
        sf::Event event;
        float elapsed;
        while(window.isOpen())
        {
                elapsed += clock.restart().asSeconds();
                std::cout << 1.f/elapsed << std::endl;
                while(elapsed > 1.f/60.f)
                {
                        while(window.pollEvent(event))
                        {
                                if (event.type == sf::Event::Closed || event.key.code == sf::Keyboard::Escape)
                                {
                                        window.close();
                                }
                        }
                        elapsed -= 1.f/60.f;
                }
                window.clear();
                window.display();
        }

fps从40开始,上升到60,然后回落到30,然后再次增加并重复。如果将VSynct设置为false,则可以达到30-500 fps。我没有正确测试帧速率,或者我的nvidia驱动程序出了点问题(我确实将它们重新安装了2次,没有任何更改)。任何帮助表示赞赏!

最佳答案

您向我指出了一种代码与您的代码相似的 Material ,但是您编写的方式有所不同。

来自:gameprogrammingpatterns.com/game-loop.html

double previous = getCurrentTime();
double lag = 0.0;
while (true)
{
  double current = getCurrentTime();
  double elapsed = current - previous;
  previous = current;
  lag += elapsed;

  processInput();

  while (lag >= MS_PER_UPDATE)
  {
    update();
    lag -= MS_PER_UPDATE;
  }

  render();
}

您似乎对elapsedelapsed都使用了一个变量lag。那就是让我感到困惑的。您对elapsed的处理使其无法用于测量时间。我认为您的代码应该更像:
    sf::RenderWindow window(sf::VideoMode(1024, 768), "Testing");
            window.setVerticalSyncEnabled(true);
    sf::Clock clock;
    sf::Event event;
    float lag;
    float elapsed;

    while(window.isOpen())
    {
            lag = elapsed = clock.restart().asSeconds();
            std::cout << 1.f/elapsed << std::endl;
            while(lag > 1.f/60.f)
            {
                    while(window.pollEvent(event))
                    {
                            if (event.type == sf::Event::Closed || event.key.code == sf::Keyboard::Escape)
                            {
                                    window.close();
                            }
                    }
                    lag -= 1.f/60.f;
            }
            window.clear();
            window.display();
    }

我仍然不确定这是否正确。我不知道clock.restart().asSeconds()到底能做什么。就个人而言,我将像示例一样逐行实现它。为什么要重新设计工作代码?

编辑:OP确认,使用elapsed进行“限制”违反了其作为时间的测量变量的目的。

10-01 06:49