LibGdx呈现多个自定义actor的性能

时间:2016-11-30 10:42:58

标签: java libgdx

我在libGdx中制作了简单的自定义actor。

public class HealthBar extends Actor {
private Texture background;
private Texture bar;
private float max;
private float current;

public HealthBar(Color bgColor, Color barColor) {
    Pixmap bgPixmap = new Pixmap(1, 1, Pixmap.Format.RGB565);
    bgPixmap.setColor(bgColor);
    bgPixmap.drawPixel(0, 0);
    background = new Texture(bgPixmap);
    bgPixmap.dispose();
    Pixmap barPixmap = new Pixmap(1, 1, Pixmap.Format.RGB565);
    barPixmap.setColor(barColor);
    barPixmap.drawPixel(0, 0);
    bar = new Texture(barPixmap);
    barPixmap.dispose();
}

@Override
public void draw(Batch batch, float parentAlpha) {
    batch.draw(background, getX(), getY(), getWidth(), getHeight());
    batch.draw(bar, getX(), getY(), getBarEnd(), getHeight());
}

private float getBarEnd() {
    return current / max * getWidth();
}

public void setHealth(float current, float max) {
    this.current = current;
    this.max = max;
}

public void dispose(){
    background.dispose();
    bar.dispose();
}

}

我在小组的第2阶段渲染了大约30个。

问题是渲染这个花费我大约每秒20帧。渲染相同数量的简单Label对性能没有明显影响。我在这段代码中遗漏了什么?这些Actors被添加到使用Stage渲染的组中。

performance when drawing

performance with draw() content commented

1 个答案:

答案 0 :(得分:2)

通过为背景创建单独的Texture对象,导致SpriteBatch必须刷新两次以绘制每个HealthBars。 SpriteBatch每次收到命令时都必须刷​​新,以绘制与提交绘图的最后一个纹理不匹配的纹理。

(不相关,但是创建相同纹理的这么多副本也非常浪费 - 创建一个白色图像并让所有健康栏使用它会更有意义。)

执行此操作的正确方法是将纯白图像放入TextureAtlas中,并在UI中使用其余图像并在演员中使用该图像。在绘制背景之前,您可以在批处理上调用setColor,然后使用条形图使白色纹理区域看起来像您想要的任何颜色。这大大减少或消除了批量刷新(当舞台完成绘制所有内容时,最后一次除外)。

但是,除非您在非常低端的手机或Android模拟器上进行测试,否则额外的60次批量刷新通常不足以获得如此大的帧速率下降。 Android模拟器无法获得设备上实际性能的印象。