【问题标题】:setFramerateLimit() function not working in sfmlsetFramerateLimit() 函数在 sfml 中不起作用
【发布时间】:2018-07-08 19:57:12
【问题描述】:

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

不工作。请告诉我哪里出错了?

【问题讨论】:

  • 我认为您应该使用此代码获得 0 fps,因为您没有渲染任何内容。

标签: c++ sfml frame-rate


【解决方案1】:

来自setFrameLimit的文档:

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

您不渲染任何内容,并且您从未真正交换绘制缓冲区(这就是调用 win.display() 会做的事情)。

【讨论】:

    【解决方案2】:

    问题是你没有打电话

    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;
    }
    

    【讨论】:

    • 其实计算经过时间(t)本身也有问题。时钟应同时读取和重新启动;因此clock.restart() 的行应该被删除,display() 调用之后的行应该修改为t = clock.restart();。不过,在上述函数中,差异可能可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多