在过去的一周中,我一直在做游戏的核心,我碰壁了,因为渲染根本不够好。运动很生涩,我流泪了,总体上有很多滞后。我以为这可能不是我的游戏引擎的错,所以我用一个非常简单的游戏循环测试了渲染:
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();
}
您似乎对
elapsed
和elapsed
都使用了一个变量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
进行“限制”违反了其作为时间的测量变量的目的。