setFramerateLimit()函数在sfml中不起作用

问题描述 投票:0回答:2

我正在尝试学习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);

不管用。请告诉我哪里出错了?

c++ sfml frame-rate
2个回答
2
投票

setFrameLimit的文档:

如果设置了限制,则在每次调用display()后窗口将使用一小段延迟,以确保当前帧持续足够长的时间以匹配帧速率限制。

你没有渲染任何东西,你从来没有实际交换绘制缓冲区(这是对win.display()的调用)。


1
投票

问题是你没有打电话

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.