代码之家  ›  专栏  ›  技术社区  ›  Sapp

libgdx中的TextureAtlas和renderCalls

  •  0
  • Sapp  · 技术社区  · 6 年前

    我正在创建两个纹理,并将它们放在同一个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();
    }
    

    我在等批次。renderCalls等于1,因为纹理位于相同的TextureAtlas中,但它等于200。我做错了什么?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Arctic45    6 年前

    为了画出你的 TextureRegions 在单个渲染调用中,每个渲染调用都必须是同一个渲染调用的一部分 Texture TextureAtlas .

    纹理LAS 可以包含 纹理区域 不同的 Textures ,这实际上发生在你的案例中。即使你使用相同的 Pixmap ,创建两个不同的 纹理 从中。

        2
  •  0
  •   icarumbas    6 年前

    你在循环中绘制了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 TextureRegions @Arctic23是如何注意到的。

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

    使命感 batch.draw(..) 每次绘制纹理都不是一个大的性能问题。所以我不知道你为什么要拆开这个。