【问题标题】:Does the number of texture(s) used effect performance?使用的纹理数量是否会影响性能?
【发布时间】:2013-12-28 05:41:12
【问题描述】:

我正在使用 SFML 创建一个小型 2D 游戏,但在互联网上遇到了一些警告,说我应该尽可能少地使用不同的纹理来获得最佳性能。

使用这个词在这里是什么意思?只是我有多少纹理,还是我的精灵每帧要求多少?我可以在菜单中使用一堆纹理(比如超过 5 个),还是在游戏运行时只使用一个(菜单纹理仍然存在)并且不会影响性能?

【问题讨论】:

    标签: performance graphics textures sfml


    【解决方案1】:

    事实上,是纹理绑定调用 (OpenGL glbindtexture) 的性能开销很大(如果更新的 OpenGL 版本没有改变的话)。由于 SFML 在 OpenGL 之上运行,因此每个使用您需要渲染的不同纹理的 Sprite 都会切换纹理以绑定它需要的纹理。

    因此,您的整个项目可能只有 2 个纹理,但是为 10000 个对象中的每一个在两者之间切换,您仍然会遇到性能问题。另一方面,您可以拥有 100 个纹理(这不是一个好主意),并使用第一个纹理进行 99% 的渲染,然后切换到其他 99 个纹理,这样性能就可以了。

    我强烈建议您将资产批量处理成更大的图像。比如一两个用于游戏渲染,一两个用于GUI,并确保不要切换太多次。然后,您可以将它们的部分(子矩形)与 sf::Sprite 一起使用,这是一个轻量级对象。

    但请记住,在优化之前最好先让某些东西工作。不过,从一开始就获取所需的信息以走上正确的道路绝不是一个坏主意。

    【讨论】:

      【解决方案2】:

      用于渲染单个帧的纹理数量会影响性能。

      如果只使用 5 个纹理,这意味着只要尽可能高效地绘制它们,则每帧只需要在纹理之间切换 5 次。

      如果您正在绘制 10.000 个对象,所有这些对象都可以使用相同的单个纹理进行绘制,那么使用 10.000 个看起来完全相同的纹理将是一个糟糕的主意,因为您将每帧切换纹理 10.000 次而没有原因。

      切换纹理不是免费的;它花费时间和处理器周期。 因此,尤其是在游戏中,我们希望尽可能少地这样做。

      其次,大纹理占用大量空间。 只要您的所有纹理都紧贴内存而无需任何交换或其他技巧,您就不会受到纹理大小的太大影响。

      但是一旦它们变得太大,这也开始产生影响。

      【讨论】:

      • 公平地说,如果您要从低级 GL 一直实现这一点,您会希望每帧使用尽可能少的 GL 调用,因为它们全部花费时间。
      • 是的,我知道在渲染时从一个纹理切换到另一个纹理很慢,但是如果我只使用一个或两个纹理进行游戏渲染,然后使用一百个用于菜单,那么游戏不会很慢吧?因为切换纹理不好,拥有很多纹理也不错,不是吗?
      • 只要它们都快乐地融入内存,拥有一堆纹理就不会受到伤害:)
      • 谢谢,这就是我想知道的!
      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 2016-05-19
      • 2013-03-09
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多