我正在尝试学习SFML,我想限制帧速率。这是我的代码: -
#include <iostream>
#include <SFML/Graphics.hpp
int main()
{
sf::Window win (sf::VideoMode(200,200),"SDSDefgwre");
sf::Clock clock;
win.setFramerateLimit(30);
sf::Time t;
while(win.isOpen())
{
sf::Event e;
clock.restart().asSeconds();
while(win.pollEvent(e))
{
if(e.type == sf::Event::Closed)
win.close();
}
t = clock.getElapsedTime();
std::cout << 1.f/t.asSeconds() <<'\n';
}
return 0;
}
在我运行此代码的地方,我得到200000 FPS。意思是
win.setFramerateLimit(60);
不管用。请告诉我哪里出错了?
从setFrameLimit
的文档:
如果设置了限制,则在每次调用
display()
后窗口将使用一小段延迟,以确保当前帧持续足够长的时间以匹配帧速率限制。
你没有渲染任何东西,你从来没有实际交换绘制缓冲区(这是对win.display()
的调用)。
问题是你没有打电话
win.display()
因为窗口在显示功能中等待帧。
你的代码应该是这样的
#include <iostream>
#include <SFML/Graphics.hpp>
int main()
{
sf::Window win(sf::VideoMode(200, 200), "SDSDefgwre");
sf::Clock clock;
win.setFramerateLimit(30);
sf::Time t;
while (win.isOpen())
{
sf::Event e;
clock.restart().asSeconds();
while (win.pollEvent(e))
{
if (e.type == sf::Event::Closed)
win.close();
}
win.display();
t = clock.getElapsedTime();
std::cout << 1.0 / t.asSeconds() << '\n';
}
return 0;
}