java - LibGdx 渲染多个自定义 actor 性能

标签 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();
}

}

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

问题是渲染此图像的成本约为每秒 20 帧。渲染相同数量的简单标签不会对性能产生明显影响。我在这段代码中遗漏了一些东西吗?这些 Actor 被添加到使用 Stage 渲染的组中。

performance when drawing

performance with draw() content commented

最佳答案

通过为背景创建单独的纹理对象,您将导致 SpriteBatch 必须刷新两次才能绘制每个 HealthBar。 SpriteBatch 每次收到绘制纹理的命令时都必须刷​​新,该命令与上次提交绘制的纹理不匹配。

(不相关,但创建相同纹理的这么多副本也是非常浪费的——创建单个白色图像并让所有生命条都使用它会更有意义。)

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

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

关于java - LibGdx 渲染多个自定义 actor 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40886241/

相关文章:

java - 你如何在 apache camel 中对 servlet 端点进行单元测试?

java.lang.NoClassDefFoundError : org. apache.batik.dom.svg.SVGDOMImplementation

java - OpenCV中Dense算法的修改

java - 为什么空 libGDX-App 的 RAM 使用率稳步攀升?

java - 如何在 libgdx 中交换 actor

java - 即使测试用例失败也执行 Selenium 脚本

java - 如何使用java访问远程数据库

java - 如何在Libgdx中在屏幕上实现ZoomIn ZoomOut的效果

java - 我可以使用 jdk 7 for android 和 1.6 编译器吗?

java - 我可以仅缩放 OrthograficCamera libgdx 的一部分吗