Android 调用libgdx SpriteBatch begin和end方法的代价是原来的数倍吗?

Android 调用libgdx SpriteBatch begin和end方法的代价是原来的数倍吗?,android,performance,methods,opengl-es,libgdx,Android,Performance,Methods,Opengl Es,Libgdx,如果我多次调用libgdx SpriteBatch begin和end方法,它们对处理器来说是昂贵的还是会降低性能 例如: 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

如果我多次调用libgdx SpriteBatch begin和end方法,它们对处理器来说是昂贵的还是会降低性能

例如:

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
}

在上面的代码中,我只调用了两次begin和end。但是我想做4到5次……这会让事情变慢吗?

它不贵。别担心。请记住,如果使用不同的纹理,则不必为每个纹理调用“开始”和“结束”。它会自动切换正在绘制的区域的纹理。当然,这意味着您必须对区域的图形调用进行分组

这将更好地解释它,假设我们有一个包含英雄和敌人所有纹理区域的地图集,另一个包含硬币和平台的所有纹理区域:

//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

从2次通话改为5次通话并不是什么大事

但是,一般来说,
end
调用会导致批处理清除其累积的所有状态,并调用底层的OpenGL draw调用。(如果填满,它可能会提前刷新,或者您切换纹理,但通常在
结束时进行刷新。)减少OpenGL绘图调用和纹理上载的调用是
SpriteBatch
类的主要动机


SpriteBatch
上有一些计数器,可以用来查看它在实践中的实际情况,这将有助于指出您是否做得太多。请看

谢谢@lestat,实际上我正计划一层一层地渲染一个瓷砖贴图,并在该层之间绘制一些东西,但要做到这一点,我需要像“开始-结束”那样开始。在此处输入代码public void render(float delta){..//draw tile layer batch.begin();stage.draw();batch.end();//绘制另一个tile layer batch.begin();//绘制最后一个tile layer},因此我必须多次调用begin来实现我的目标。无论如何,谢谢你的回复。你对背景的性能改进是否会导致应用程序的视觉差异?