【问题标题】:is calling libgdx SpriteBatch begin and end method multiple times expensive?多次调用 libgdx SpriteBatch 开始和结束方法是否昂贵?
【发布时间】:2013-06-19 19:14:05
【问题描述】:

如果我多次调用它们,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 次....这会减慢速度吗?

【问题讨论】:

    标签: android performance methods opengl-es libgdx


    【解决方案1】:

    不贵。不用担心。请记住,您不必这样做,如果您使用不同的纹理,则不必为每个纹理调用 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
    

    【讨论】:

    • 感谢@lestat,实际上我计划逐层渲染tileMap并在该层之间绘制一些东西,但要做到这一点,我需要像开始一样。在此处输入代码 public void render(float delta) { . . //绘制瓦片层batch.begin();阶段.draw();批处理.end(); //绘制另一个瓦片层batch.begin(); //绘制另一个纹理 batch.end(); //绘制最后一个瓷砖层}所以我必须多次调用开始才能实现我的目标。无论如何感谢您的回复。
    • 您对背景的性能改进是否会导致应用程序出现任何视觉差异?
    【解决方案2】:

    从 2 个调用变为 5 个调用并不是什么大不了的事。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多