我在 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();
}
}
我正在小组的第 2d 阶段渲染大约 30 个。
问题是渲染此图像的成本约为每秒 20 帧。渲染相同数量的简单标签不会对性能产生明显影响。我在这段代码中遗漏了一些东西吗?这些 Actor 被添加到使用 Stage 渲染的组中。
最佳答案
通过为背景创建单独的纹理对象,您将导致 SpriteBatch 必须刷新两次才能绘制每个 HealthBar。 SpriteBatch 每次收到绘制纹理的命令时都必须刷新,该命令与上次提交绘制的纹理不匹配。
(不相关,但创建相同纹理的这么多副本也是非常浪费的——创建单个白色图像并让所有生命条都使用它会更有意义。)
执行此操作的正确方法是将纯白色图像与 UI 中使用的其余图像一起放入 TextureAtlas 中,并在 Actor 中使用它。您可以在绘制背景和条形图之前对批处理调用 setColor
,以使白色纹理区域看起来像您想要的任何颜色。这大大减少或消除了批量刷新(除了舞台完成绘制所有内容时的最后一次刷新)。
但是,额外的 60 次批量刷新通常不足以获得如此大的帧速率下降,除非您在非常低端的手机或 Android 模拟器上进行测试。 Android 模拟器对于了解设备的实际性能毫无用处。
关于java - LibGdx 渲染多个自定义 actor 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40886241/