正确使用TextureAtlas来限制绑定时间

时间:2014-11-15 14:28:19

标签: libgdx

我一直在阅读初级Android游戏,它说SpriteBatcher.begin()会绑定要使用的纹理并清除缓冲区。我的问题涉及纹理图集的正确用法,以限制绑定这些纹理所需的时间。如果一个绝对需要为不同的精灵使用不同的SpriteBatchers,那么应该在整个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()
...

或者使用更多尺寸更小的TextureAtlases更快,每个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()
...

1 个答案:

答案 0 :(得分:2)

一般情况下,不应该有多个SpriteBatch的真正原因。此外,您还应将begin()end()来电保持在最低限度。

您使用的批次越多,通过开始/结束中断批处理的次数越多,您丢失的性能就越高。

如果你的精灵只有一个纹理,你按照A,B,A,B,A,B的顺序激活你的绘制调用,那么你最多可以有6个纹理绑定。

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

您的地图集页面的大小通常不会产生影响。在后台发生的所有事情都是要设置的另一个ID,当你刚刚绑定另一个纹理时,实际的纹理不会被移动到任何地方,或者无论如何都会被处理。

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