【发布时间】:2013-12-28 05:41:12
【问题描述】:
我正在使用 SFML 创建一个小型 2D 游戏,但在互联网上遇到了一些警告,说我应该尽可能少地使用不同的纹理来获得最佳性能。
使用这个词在这里是什么意思?只是我有多少纹理,还是我的精灵每帧要求多少?我可以在菜单中使用一堆纹理(比如超过 5 个),还是在游戏运行时只使用一个(菜单纹理仍然存在)并且不会影响性能?
【问题讨论】:
标签: performance graphics textures sfml
我正在使用 SFML 创建一个小型 2D 游戏,但在互联网上遇到了一些警告,说我应该尽可能少地使用不同的纹理来获得最佳性能。
使用这个词在这里是什么意思?只是我有多少纹理,还是我的精灵每帧要求多少?我可以在菜单中使用一堆纹理(比如超过 5 个),还是在游戏运行时只使用一个(菜单纹理仍然存在)并且不会影响性能?
【问题讨论】:
标签: performance graphics textures sfml
事实上,是纹理绑定调用 (OpenGL glbindtexture) 的性能开销很大(如果更新的 OpenGL 版本没有改变的话)。由于 SFML 在 OpenGL 之上运行,因此每个使用您需要渲染的不同纹理的 Sprite 都会切换纹理以绑定它需要的纹理。
因此,您的整个项目可能只有 2 个纹理,但是为 10000 个对象中的每一个在两者之间切换,您仍然会遇到性能问题。另一方面,您可以拥有 100 个纹理(这不是一个好主意),并使用第一个纹理进行 99% 的渲染,然后切换到其他 99 个纹理,这样性能就可以了。
我强烈建议您将资产批量处理成更大的图像。比如一两个用于游戏渲染,一两个用于GUI,并确保不要切换太多次。然后,您可以将它们的部分(子矩形)与 sf::Sprite 一起使用,这是一个轻量级对象。
但请记住,在优化之前最好先让某些东西工作。不过,从一开始就获取所需的信息以走上正确的道路绝不是一个坏主意。
【讨论】:
用于渲染单个帧的纹理数量会影响性能。
如果只使用 5 个纹理,这意味着只要尽可能高效地绘制它们,则每帧只需要在纹理之间切换 5 次。
如果您正在绘制 10.000 个对象,所有这些对象都可以使用相同的单个纹理进行绘制,那么使用 10.000 个看起来完全相同的纹理将是一个糟糕的主意,因为您将每帧切换纹理 10.000 次而没有原因。
切换纹理不是免费的;它花费时间和处理器周期。 因此,尤其是在游戏中,我们希望尽可能少地这样做。
其次,大纹理占用大量空间。 只要您的所有纹理都紧贴内存而无需任何交换或其他技巧,您就不会受到纹理大小的太大影响。
但是一旦它们变得太大,这也开始产生影响。
【讨论】: