c++ - 当您首先绘制具有相似纹理的 Sprite 时,sf::RenderWindow 是否绘制得更快

标签 c++ optimization sfml

例如,我有:

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 个 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/

相关文章:

c++ - 如何按照模式对特定文件运行 cppcheck?

c++ - 在 Windows 8 上使用 Code::Blocks 设置 SFML

c++ - 如何为 SFML 游戏创建 macOS .app bundle ?

c++ - Visual Studio C++ 2010 错误 LNK2019 : unresolved external symbol

c++ - 您可以删除从 fopen 创建的 FILE 对象吗?

multithreading - 在 Julia 中使用多线程创建 JuMP 模型

css - 带有 r.js 优化器的多个 css 模块?

c++ - 有没有办法让编译器优化对外部函数的多次调用?

c++ - 当我在 C++/SFML 中按下鼠标按钮时如何绘制球

c++ - 在 C++ 中转发声明一个隐藏的 typedef