sf::RenderWindow 在先绘制具有相似纹理的精灵时绘制速度是否更快



例如,我有:

sf::RenderWindow window;
sf::Texture text1, text2;
sf::Sprite a, b, c, d;

所有这些都已初始化。text1text2有不同的文件。然后我做:

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 个精灵需要多长时间 几千次,然后再次进行测试,但绘制 4 个精灵的顺序不正确。检查两次之间的差异,这将回答您的问题,对于您的计算机 - 见下文。

话虽如此,我假设结果会因您的 SFML 库版本、正在使用的 OpenGL 库版本甚至 GPU 本身而异。SFML 或 OpenGL 处理纹理的方式可能因版本而异,因此一个版本上可能很快的内容在另一个版本上可能很慢。

对于 GPU,纹理可能会缓存(临时保存)在 GPU 内部,因此在第一次渲染冲刺后,它的纹理将被保存,下次可以更快地重新渲染。我知道这发生在 3D 对象 (VBO?

我还应该注意,如果你想渲染一个新的精灵,而你的GPU没有任何多余的内存来制作精灵纹理,那么它将不得不刷新缓存并加载新纹理。这可能会非常慢并降低您的游戏性能。然而,如今大多数GPU都有许多千兆字节的内存,所以这应该不是问题。

测试您的代码并找出答案,在此处发布您的结果。

> 不一定。
但肯定更快的是一次绘制使用相同纹理的所有内容。这是通过使用sf::VertexArrays 而不是精灵来完成的。
在您的情况下,您将有 2 个数组,每个数组包含 8 个顶点(每个精灵 4 个顶点,每个纹理 1 个数组)。

最新更新