例如,我有:
sf::RenderWindow window;
sf::Texture text1, text2;
sf::Sprite a, b, c, d;
所有这些都已初始化。 text1
和 text2
有不同的文件。然后我做:
a.setTexture(text1);
b.setTexture(text1);
c.setTexture(text2);
d.setTexture(text2);
这样做是否更快:
window.clear()
window.draw(a);
window.draw(b);
window.draw(c);
window.draw(d);
window.display();
如果我这样做的话:
window.clear();
window.draw(a);
window.draw(c);
window.draw(b);
window.draw(d);
window.display();
?
最佳答案
您可以在您的代码中做一些计时来测试这是否属实 - 计算按顺序绘制 4 个 Sprite 需要多长时间几千次,然后再次执行此操作再次测试但绘制 4 个 Sprite 时乱序.检查这两个时间之间的差异,这将为您的计算机回答您的问题 - 见下文。
话虽如此,我假设结果会因您的 SFML 库版本、正在使用的 OpenGL 库版本/甚至 GPU 本身而异。 SFML 或 OpenGL 处理纹理的方式可能因版本而异,因此在一个版本上可能很快的东西在另一个版本上可能会很慢。
对于GPU来说,纹理可能会缓存(暂时保存)在GPU内部,所以在第一次渲染sprint后,它的纹理会被保存下来,下次重新渲染的速度会快很多。我知道 3D 对象(VBO?)会发生这种情况。
我还应该注意,如果你想渲染一个新的 Sprite ,而你的 GPU 没有任何空闲内存用于 Sprite 纹理,那么它必须刷新缓存并加载新纹理。这可能会极度减慢并降低您的游戏性能。然而,如今大多数 GPU 都有数 GB 的内存,所以这应该不是真正的问题。
测试您的代码并找出答案,在此处发布您的结果。
关于c++ - 当您首先绘制具有相似纹理的 Sprite 时,sf::RenderWindow 是否绘制得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63544905/