LibGDX SpriteBatch draw() 是否足够聪明,不会在每次 render() 调用时重绘 100% 完全相同的精灵?

Is LibGDX SpriteBatch draw() smart enough not to redraw 100% exactly same sprite at each render() call?

LibGDX SpriteBatch draw() 是否足够聪明,不会在每次 render() 调用时重绘 100% 完全相同的精灵?

 public void render(float delta) {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

            if (shallFadeOut) {  // becomes true when sound message finishes
                doFadingOut();
                showNextScreen();
                dispose(); 
            } else {
                batch.begin();
                // introSprite is a static image - it never changes a pixel (splash screen)
                // I need to paint it once and then just wait until sound message finishes
                // DON'T NEED TO REDRAW IT EVERY render() cycle 60 times/sec (~60 fpm)
                introSprite.draw(batch);  
                batch.end();
            }
}

恐怕我认为批处理渲染步骤之间的 Batch 不会进行任何核算,以查看纹理是否已经加载并准备好渲染,但纹理本身可能。

批处理适用于您在同一渲染步骤中绘制相同事物的副本的情况,这样您就不会在精灵之间进行不必要的上下文切换,也不必将数据重新加载到您的显卡。

我相信您知道批次是由您正在使用的 beginend 调用定义的,这取决于您实际渲染特定类型的所有精灵另一个不跳转渲染其他东西。这可以在批量绘制代码 here 中看到,但为了便于阅读,相关行如下:

Texture texture = region.texture;
if (texture != lastTexture) {
    switchTexture(texture);
} else if (idx == vertices.length) {
    flush();
}

要利用批处理 - 您应该将所有 sprite 类型的渲染分组,并且在步骤之间,据我所知,批处理在设计上没有提供任何效率。

但是,在批处理步骤或游戏循环之间,绑定纹理时,它使用固定的目标和句柄,可以看出 here。这意味着,如果您绘制的只是用于多个渲染循环的单个精灵,libgdx 应该会像预期的那样高效地使用您的内存和显卡。

在 OpenGL 中,您通常会在每一帧重绘整个屏幕。怀疑批处理是否足够聪明以避免重绘相同的东西是没有意义的,因为它 必须 重绘它以防止它消失。

如果您想暂时避免在屏幕上重绘任何内容以节省设备电量,您可以使用 GDX.graphics.setContinuousRendering(false) 但这意味着您的 render() 方法将停止被调用,因此您必须使用计时器或输入回调将其设置回 true。

您也可以使用布尔值来决定是否使用 glClear 清除屏幕并绘制内容,但在幕后,LibGDX 仍会请求 OpenGL 在两者之间复制屏幕缓冲区数据后台缓冲区和屏幕缓冲区。

并不是说绘制单个精灵是非常微不足道的,可能不值得考虑优化它。