我在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渲染的组中。
答案 0 :(得分:2)
通过为背景创建单独的Texture对象,导致SpriteBatch必须刷新两次以绘制每个HealthBars。 SpriteBatch每次收到命令时都必须刷新,以绘制与提交绘图的最后一个纹理不匹配的纹理。
(不相关,但是创建相同纹理的这么多副本也非常浪费 - 创建一个白色图像并让所有健康栏使用它会更有意义。)
执行此操作的正确方法是将纯白图像放入TextureAtlas中,并在UI中使用其余图像并在演员中使用该图像。在绘制背景之前,您可以在批处理上调用setColor
,然后使用条形图使白色纹理区域看起来像您想要的任何颜色。这大大减少或消除了批量刷新(当舞台完成绘制所有内容时,最后一次除外)。
但是,除非您在非常低端的手机或Android模拟器上进行测试,否则额外的60次批量刷新通常不足以获得如此大的帧速率下降。 Android模拟器无法获得设备上实际性能的印象。