Libgdx 正确使用TextureAtlas以限制绑定时间

Libgdx 正确使用TextureAtlas以限制绑定时间,libgdx,Libgdx,我一直在读Android游戏的开头,上面说SpriteBatcher.begin()绑定要使用的纹理并清除缓冲区。我的问题涉及如何正确使用纹理地图集来限制绑定这些纹理所需的时间。在绝对需要为不同的精灵使用不同的SpriteBatcher的情况下,是否应为整个batch.begin、batch.end系列使用尽可能少的纹理地图集 batch1.begin() spriteA_from_atlas_general.draw(batch1); spriteB_from_atlas_general.dr

我一直在读Android游戏的开头,上面说SpriteBatcher.begin()绑定要使用的纹理并清除缓冲区。我的问题涉及如何正确使用纹理地图集来限制绑定这些纹理所需的时间。在绝对需要为不同的精灵使用不同的SpriteBatcher的情况下,是否应为整个batch.begin、batch.end系列使用尽可能少的纹理地图集

batch1.begin()
spriteA_from_atlas_general.draw(batch1);
spriteB_from_atlas_general.draw(batch1);
....
batch1.end()
batch2.begin()
spriteX_from_atlas_general.draw(batch2);
spriteY_from_atlas_general(batch2);
....
batch2.end()
...
或者使用更多尺寸更小的纹理贴图(每个batch.begin、batch.end会话一个)会更快吗?因为更小的纹理地图集意味着绑定它们的时间更短

batch1.begin()
spriteA_from_atlas1.draw(batch1);
spriteB_from_atlas1.draw(batch1);
....
batch1.end()
batch2.begin()
spriteX_from_atlas2.draw(batch2);
spriteY_from_atlas2.draw(batch2);
....
batch2.end()
...

一般来说,不应该有超过一个
SpriteBatch
的真正原因。您还应该尽量减少
begin()
end()
调用

使用的批处理越多,通过begin/end中断批处理的频率越高,性能损失就越大

如果您的精灵只有一个纹理,并且您按照A、B、A、B、A、B的顺序启动绘制调用,那么您将有多达6个纹理绑定

如果将这两种纹理都放入
TextureAtlas
,它们将具有相同的纹理,并且只有一个纹理绑定

地图集页面的大小通常不会有什么不同。在背景中发生的所有事情都是要设置另一个ID,当您仅绑定另一个纹理时,实际纹理不会移动到任何地方,也不会以任何方式进行处理


因此,您应该使用尽可能大的纹理图集页面。然而,有一个权衡。页面大小越大,一些设备就越可能不再支持这些大小。另外,页面大小越大,您可能浪费的内存就越多,因为页面没有完全填满,或者因为您将只使用页面的一小部分,但仍然需要完全加载。

我需要更多的精灵批次,因为我在游戏中使用了更多的相机。谢谢你的回答!但这仍然不是拥有多个SpriteBatch的理由。在我的游戏中,我一次最多有6个不同的摄像头,但仍然只有一个SpriteBatch。啊,好的!因此,我只是将投影矩阵和摄影机更新为同一批。是的,在使用另一台摄影机之前,您只需要调用spriteBatch.setProjectionMatrix(camera.combined)。请注意,spriteBatch不会对绘图调用进行排序。