我正在编写一个应用程序,绘制多个数字和比较图像(计算像素值)。绘制和计数线程不显示任何图像。目前,我发现了一个非常奇怪的异常情况。我的绘图和比较线程工作得很慢,但是当我在主循环之前添加了 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(在我的应用程序中它是可选的)。我只想从命令行运行我的应用程序。
我已经开启了一个问题 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设计者的设计方式。"