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(..)
并不是一个大的性能问题。所以我不知道你为什么要分离这个。
我正在创建两个纹理并将它们放在同一个 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(..)
并不是一个大的性能问题。所以我不知道你为什么要分离这个。