15

如果我多次调用它们,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 次 begin 和 end。但我想做 4 或 5 次....这会减慢速度吗?

4

2 回答 2

11

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

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

//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
于 2013-06-19T20:55:08.690 回答
4

从 2 个电话到 5 个电话不会有太大的问题。

然而,一般来说,end调用会导致批处理清除它累积的所有状态并调用底层的 OpenGL 绘图调用。(如果它被填满,或者你切换纹理,它可能会更早地刷新,但通常刷新发生在end时间。)减少 OpenGL 绘制调用和纹理上传的调用是SpriteBatch该类的主要动机。

您可以使用一些计数器SpriteBatch来查看它在实践中的实际表现,这将有助于指出您是否做得太多。请参阅https://code.google.com/p/libgdx/wiki/SpriteBatch#Performance_tuning

于 2013-06-20T00:10:47.780 回答