我正在使用libGDX在Java中制作游戏。在每个对象的渲染方法中,调用 SpriteBatch.begin() 和 SpriteBatch.end()。这是一个好的做法吗?我应该只在处理所有渲染的 Screen 类中调用 begin() 和 end() 吗?
不,这不是好的做法,因为它违背了 SpriteBatch 的目的:将多个精灵批处理到单个绘制调用中,以最大程度地减少每个绘制调用的相关性能损失。
您应该尽量减少对begin()
和end()
的调用次数,但这仅在您绘制一系列都引用相同纹理的对象时才有用(它们可能是来自同一纹理图集的纹理区域)。每次使用引用不同纹理的内容调用spriteBatch.draw()
时,它相当于(在性能上)调用end()
并再次begin()
。每次打电话给setShader()
或setProjectionMatrix()
或setBlendFunction()
时也是如此。
我认为最干净的方法是如您所描述的。仅在 Screen 类中调用 begin()
和 end()
。但是,如果您使用多个不同的纹理图集,则还应对对象的绘制顺序进行排序,以对共享相同纹理(或混合模式/着色器/投影矩阵)的对象进行分组。