当sf::Window没有被创建时,SFML会出现大量的性能损失。

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

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

我正在寻找一种不需要使用下面的方法来提高性能 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;
}

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

c++ performance sfml
1个回答
1
投票

我已经开启了一个问题 SFML github 并发现这是激活和停用上下文造成的,所以在这种情况下,而不是。

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

应该是

sf::Context some_context;.

原问题链接。https:/github.comSFMLSFMLissues1672。

完整的答案。

"当 sf::RenderTexture 绘制完成后,它试图将状态恢复到绘制调用前的状态。由于这是 "无上下文 "状态,因此它将在每次迭代中反复激活和停用上下文。这是任何可以独立生存而不需要窗口的OpenGL资源的标准行为。

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

由于OpenGL的性质,你永远无法绕过拥有某种窗口(不管它是否可见)本身拥有上下文的限制。这只是25年前API设计者的设计方式。"

© www.soinside.com 2019 - 2024. All rights reserved.