未创建 sf::Window 时 SFML 大量性能损失

SFML massive performance loss when sf::Window is not created

我正在编写一个应用程序来绘制多个图形并比较图像(计算像素值)。绘图和计数线程不显示任何图像。 Gui 在另一个线程中实现。 目前,我发现了非常奇怪的异常。我的绘图和比较线程工作得非常慢,但是当我在主循环之前添加时 sf::Window 我的性能提高了 x70,但是添加这些行会破坏我的 GUI(可能是因为我在另一个线程中创建了 window)*.

我正在寻找一种无需使用 sf::Window::create(...) 即可提高性能的方法。

完整示例:

    int main()
{
    // sf::Window window(sf::VideoMode(200, 200), "SFML");

    std::vector<sf::CircleShape> circles_;
    for (int i = 0; i < 200; i++)
    {
        sf::CircleShape circle(rand() % 50 + 10, 20);
        circle.setFillColor(sf::Color(rand() % 256, rand() % 256, rand() % 256, 128));
        circle.setPosition(rand() % (100), rand() % (100));
        circles_.push_back(circle);
    }
    sf::RenderTexture generated_texture;
    generated_texture.create(100, 100);
    sf::Clock clock;
    uint i = 0;
    while (i < 10)
    {

        for (auto &shape : circles_)
        {
            generated_texture.draw(shape);
        }
        i++;
    }
    double result = double(i) / clock.getElapsedTime().asSeconds();
    cout << "Result: " << result << " loops/sec";
    return 0;
}

*为简化起见,我们假设我没有任何图形用户界面(在我的应用程序中它是可选的)。我只想从命令行 运行 我的应用程序。

我在 SFML github 上打开了一个问题,发现它是由激活和停用上下文引起的,所以在这种情况下而不是:

sf::Window window(sf::VideoMode(200, 200), "SFML");

应该是

sf::Context some_context;.

原刊link: https://github.com/SFML/SFML/issues/1672

完整答案:

"When sf::RenderTexture is done drawing it tries to restore the state to how it was before the draw call. Since this was the "no context"状态它将在每次迭代中重复激活和停用上下文。这是任何 OpenGL 资源的标准行为,它可以独立存在而不必 window。

如果你想做任何与渲染相关的事情,建议总是有一些上下文拥有的东西在身边。如果您不想要完整的 sf::Window,那么 sf::Context 也行。

由于 OpenGL 的性质,您永远无法绕过拥有某种自身拥有上下文的 window(无论是否可见)的限制。这正是 API 设计师 25 年前设计的方式。"