【问题标题】:High CPU usage of simple program简单程序CPU占用率高
【发布时间】:2016-03-22 18:12:37
【问题描述】:

下面的代码是一个空窗口,但在我的 Intel i3 上显示了 25% 的相对较高的 CPU 使用率。我也尝试了setFramerateLimit,没有任何变化。有没有办法降低 CPU 使用率?

#include<SFML/Window.hpp>

void processEvents(sf::Window& window);

int main()
{
    sf::Window window(sf::VideoMode(800, 600), "My Window", sf::Style::Close);
    window.setVerticalSyncEnabled(true);

    while (window.isOpen())
    {
        processEvents(window);
    }
    return 0;
}

void processEvents(sf::Window& window)
{
    sf::Event event;
    window.pollEvent(event);
    switch (event.type)
    {
    case sf::Event::Closed:
        window.close();
        break;
    }
}

【问题讨论】:

    标签: c++ cpu-usage sfml


    【解决方案1】:

    由于您没有在循环中调用window.display(),因此请注意将线程暂停适当的时间,使用sf::RenderWindow::setVerticalSyncEnabledsf::RenderWindow::setMaxFramerateLimit 设置。

    试试这个:

    while (window.isOpen())
    {
        processEvents(window);
    
        // this makes the thread sleep
        // (for ~16.7ms minus the time already spent since
        // the previous window.display() if synced with 60FPS)
        window.display();
    }
    

    来自SFML Docs

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

    【讨论】:

      【解决方案2】:

      问题是

      while (window.isOpen())
      {
          processEvents(window);
      }
      

      是一个没有停顿的循环。由于像这样的 a 循环通常会消耗 100% 的 CPU,我不得不猜测您有一个 4 核 CPU,因此它消耗了一个完整的核心,即 CPU 容量的 25%。

      您可以在循环中添加一个暂停,这样它就不会在 100% 的时间内运行,或者您可以一起更改事件处理。

      【讨论】:

      • 问题不是无限循环本身,而是运行循环的线程在每次迭代中都不会休眠。
      猜你喜欢
      • 2014-04-03
      • 2018-02-07
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2016-05-17
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多