调用libgdx SpriteBatch开始和结束方法多次昂贵?

时间:2013-06-19 19:14:05

标签: android performance methods opengl-es libgdx

对于处理器来说libgdx SpriteBatch开始和结束方法是否昂贵,或者如果我多次调用它们会使性能变慢?

例如:

public void render(float delta) {
GL10 gl = Gdx.gl10;
gl.glClearColor(0, 0, 0, 0);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

batch.begin();
//draw something
batch.end();
//do something before draw the others
batch.begin();
//draw others
batch.end();
//update
//controls
}

在上面的代码中我只打了2次开始和结束。但是我想做4到5次......这会让事情变慢吗?

2 个答案:

答案 0 :(得分:11)

它不贵。别担心。只记得你不必,如果你使用不同的纹理,你不必为每个纹理调用begin和end。它会自动切换您正在绘制的区域的纹理。当然,这意味着您必须对区域的绘图调用进行分组。

这将更好地解释它,假设我们有一个包含Hero和Enemies所有TextureRegions的地图册,以及另一个包含所有Constingions of Coins和Platforms的地图集:

//You only need to call batch.begin once:

batch.begin();
//then draw
//-Hero
//-Enemies
//(Automatic texture switching here)
//-Coins
//-Platforms
batch.end();

稍微加一点,有一个特例:通常你的背景会填满所有的屏幕,完全不透明。因此禁用该绘制的混合肯定会提高性能。所以你批量处理一次,然后再批处理其他地区,如下:

batch.disableBlending();
batch.begin();
//draw background
batch.end();

batch.enableBlending();
batch.begin();
//etc

答案 1 :(得分:4)

从2个电话转到5个电话不会太大。

但是,通常,end调用会导致批处理清除它已累积的所有状态并调用基础OpenGL绘制调用。 (如果它填满,它可能会提前刷新,或者你切换纹理,但通常在end时发生刷新。)减少OpenGL绘制调用和纹理上传的调用是SpriteBatch类的主要动机。

你可以使用SpriteBatch上的一些计数器来查看它在实践中的实际情况,这有助于指出你是否做得太多了。见https://code.google.com/p/libgdx/wiki/SpriteBatch#Performance_tuning