我正在创建一个带有SFML的小型2D游戏,并在互联网上遇到一些警告说我应该使用尽可能少的不同纹理来实现最大性能。
使用这个词在这里意味着什么?它只是我有多少纹理,或我的精灵每帧要求多少?我可以在菜单上使用一堆纹理(比如超过5),或者在游戏运行时只使用一个纹理(菜单纹理仍然存在)并且没有性能影响?
答案 0 :(得分:2)
用于渲染单个帧的纹理数量会导致性能影响。
如果你只使用5个纹理,这意味着只要你尽可能有效地绘制它们,你只需要在每帧之间切换纹理5次。
如果您正在绘制10.000个对象,所有这些对象都可以使用相同的单个纹理绘制,那么使用看起来完全相同的10.000个纹理将是一个糟糕的想法,因为您将每帧切换纹理10.000次原因。
切换纹理不是免费的;它花费时间和处理器周期。 特别是在游戏中,我们希望尽可能少地做到这一点。
其次,大纹理占用了大量空间。 只要你的所有纹理都贴合到内存中而没有任何交换或其他技巧,你就不会受到纹理大小的影响。
但是一旦它们变得太大,它也会开始产生影响。
答案 1 :(得分:0)
实际上,纹理绑定调用(OpenGL glbindtexture
)在性能上是昂贵的(如果新的OpenGL版本没有改变)。由于SFML在OpenGL之上运行,因此每个使用不同纹理的Sprite都会切换纹理以绑定它所需的纹理。
因此,您的整个项目只能有2个纹理,但是对于10000个对象中的每个对象都要在两个纹理之间切换,您仍会遇到性能问题。另一方面,你可以拥有100个纹理(不是这个好主意)并使用第一个纹理进行99%的渲染,然后切换到99个其他纹理,这样就可以了。
我强烈建议您将资产批量处理为更大的图像。像游戏渲染中的一个或两个,以及GUI中的一个或两个,并确保不要切换到很多次。然后使用sf :: Sprite(它是一个轻量级对象)使用它们的部分(子矩形)。
但请记住,在优化之前最好先做点工作。尽管如此,从一开始就获得所需的信息并不是一个坏主意。