libgdx 中的 TextureAtlas 和 renderCalls

TextureAtlas and renderCalls in libgdx

我正在创建两个纹理并将它们放在同一个 TextureAtlas 中,如代码所示:

public void create () {
    pix = new Pixmap(100, 100, Pixmap.Format.RGBA8888);
    textureAtlas = new TextureAtlas();

    pix.setColor(Color.WHITE);
    pix.fill();
    textureAtlas.addRegion("white", new TextureRegion(new Texture(pix)));
    pix.setColor(Color.RED);
    pix.fill();
    textureAtlas.addRegion("red", new TextureRegion(new Texture(pix)));

    tr_list = textureAtlas.getRegions();

    pix.dispose()
}

然后渲染时:

public void render () {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    for (int i = 0; i < 200; ++i) {
        batch.draw(tr_list.get(i % tr_list.size), (int)(Math.random()* 500), (int)(Math.random()* 500));
    }
    font.draw(batch, "FPS: " + Integer.toString(Gdx.graphics.getFramesPerSecond()), 0, Gdx.graphics.getHeight() - 20);
    font.draw(batch, "Render Calls: " + Integer.toString(batch.renderCalls), 0, Gdx.graphics.getHeight() - 60);
    batch.end();
}

我原以为 batch.renderCalls 等于 1,因为纹理在同一个 TextureAtlas 中,但它等于 200。我做错了什么?

为了在单个渲染调用中绘制您的 TextureRegions,它们中的每一个都必须是同一个 Texture 的一部分,而不是 TextureAtlas

TextureAtlas 可以包含 TextureRegions 个不同的 Textures,这实际上发生在您的情况下。即使您使用相同的 Pixmap,您也会从中创建两个不同的 Textures

您正在循环绘制它们 200 次。

for (int i = 0; i < 200; ++i) {
    // this will be called 200 times
    batch.draw(tr_list.get(i % tr_list.size), (int)(Math.random()* 500), (int)(Math.random()* 500)); 
}

而且 TextureAtlas class 不会创建您添加到其中的纹理的猪图片。它只是 TextureRegions @Arctic23 如何注意到的容器。

所以你的主要问题是在一次渲染调用中绘制 2 个纹理。我不建议你这样做。这是可能的,但很难与他们合作。

每次绘制纹理时调用 batch.draw(..) 并不是一个大的性能问题。所以我不知道你为什么要分离这个。