未创建 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 年前设计的方式。"
我正在编写一个应用程序来绘制多个图形并比较图像(计算像素值)。绘图和计数线程不显示任何图像。 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 年前设计的方式。"