Performance 使用的纹理数量是否影响性能?

Performance 使用的纹理数量是否影响性能?,performance,graphics,textures,sfml,Performance,Graphics,Textures,Sfml,我正在用SFML创建一个小的2D游戏,在互联网上遇到了一些警告,说我应该尽可能少地使用不同的纹理来实现最高性能 这个词在这里是什么意思?是我有多少纹理,还是我的精灵要求每帧有多少纹理?我可以在菜单中使用一组纹理(如超过5个),还是在游戏运行时仅使用一个(菜单纹理仍然存在)而不会影响性能?渲染单个帧时使用的纹理数量可能会影响性能 如果只使用5个纹理,这意味着只要尽可能高效地绘制纹理,每帧只需在纹理之间切换5次 如果您正在绘制10000个对象,所有这些对象都可以使用相同的单一纹理绘制,那么使用看起来

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


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

渲染单个帧时使用的纹理数量可能会影响性能

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

如果您正在绘制10000个对象,所有这些对象都可以使用相同的单一纹理绘制,那么使用看起来完全相同的10000个纹理将是一个糟糕的主意,因为您会无缘无故地每帧切换纹理10000次

切换纹理不是免费的;它需要时间和处理器周期。 所以,特别是在游戏中,我们希望尽可能少地去做

其次,大纹理占用了大量空间。 只要你的所有纹理都能很好地嵌入到内存中,而不需要任何交换或其他技巧,你就不会受到纹理大小的太大影响


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

事实上,纹理绑定调用(OpenGL
glbindtexture
)在性能上是昂贵的(如果这在较新的OpenGL版本中没有改变的话)。由于SFML在OpenGL上运行,因此每个使用不同纹理的精灵都将切换纹理以绑定所需的纹理

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

我强烈建议你将你的资产批量到更大的图像中。比如一个或两个用于游戏渲染,一个或两个用于GUI,确保不要切换太多次。然后将它们的一部分(sub-rect)与轻量级对象
sf::Sprite
一起使用


但是请记住,在优化它之前,最好先让它工作起来。尽管如此,从一开始就获得正确路径所需的信息从来都不是一个坏主意。

公平地说,如果您一直从低级GL实现这一点,您希望在每帧使用尽可能少的GL调用,因为它们都需要时间。是的,我知道渲染时从一个纹理切换到另一个纹理很慢,但如果我只使用一个或两个纹理进行游戏渲染,使用100个纹理进行菜单渲染,那么游戏不会慢,对吗?因为切换纹理不好,拥有很多纹理也不坏,不是吗?只要它们都能愉快地融入记忆,拥有一堆纹理不会有什么坏处:)谢谢你,这就是我想知道的!