【问题标题】:Poor render performance in LibGDX with hexagonal map带有六边形贴图的 LibGDX 渲染性能不佳
【发布时间】:2015-04-02 18:40:02
【问题描述】:

所以我正在使用 LibGDX 制作一个简单的游戏,其中包含 150*150 的六边形地图,以及各种类型的单元格、岩石、透明等。

问题是当我加载地图时,我的计算机几乎完全死机,并且任何本应流畅的动作(角色移动、按钮突出显示)都比应有的时间长 5 秒以上。

以下是相关代码:

public void render(float deltY){
    Gdx.gl.glClearColor(255, 255, 255, 100);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(); 

    polygonSpriteBatch.begin();
    for (int j = 0; j < 150; j++) {
        for (int i = 0; i < 150; i++) {
           offset = i%2 == 0 ? multipleX/2 : 0;
           if (mc.getMap().getRow(i).getTile(j).getTileType().equals(TileType.Rocky)) {
                drawCell(Color.BLACK, j, i);}
           if (mc.getMap().getRow(i).getTile(j).getTileType().equals(TileType.Clear)) {
                drawCell(Color.LIGHT_GRAY, j, i);}
        }
    }
    polygonSpriteBatch.end();
    stage.draw();
}

private void drawCell(Color color, int x, int y) {
    polySprite = new PolygonSprite(makePoints(color));
    polySprite.setX(mc.getMap().getRow(y).getTile(x).getTilePosition().get_x() * multipleX + offset);
    polySprite.setY(mc.getMap().getRow(y).getTile(x).getTilePosition().get_y() * multipleY);
    polySprite.draw(polygonSpriteBatch);
}


public PolygonRegion makePoints(Color color){
    side =  5;
    h = CalculateH(side);
    r = CalculateR(side);
    multipleX = (float)Math.sqrt(3)*side;
    multipleY = side+(side/2);
    float[] points = {      // vertices
            x, y,
            x+r, y+h,
            x+r, y+side+h,
            x,y+side+h+h,
            x-r, y+side+h,
            x-r, y+h};
    return new PolygonRegion(new TextureRegion(getTexture(color)),points
            , new short[] { //4 triangles using vertices to make hexagon
            0, 1, 5,
            1, 4, 2,
            5, 1, 4,
            2, 3, 4});
}
public Texture getTexture(Color color){


    Pixmap pix = new Pixmap(1, 1, Pixmap.Format.RGBA8888);

    pix.setColor(color);
    pix.fill();
    textureSolid = new Texture(pix);

   return textureSolid;
}

我是编码和 LibGDX 的新手,所以我可能正在做一些愚蠢的事情。有什么方法可以渲染一次地图,并且只有在多边形发生变化时才重新绘制多边形?

谢谢

【问题讨论】:

  • 删除所有出现的new关键字(不要在频繁调用的方法中创建对象),否则GC会发疯。
  • 使用工具或分析器查看时间花在了哪里。

标签: java libgdx rendering polygon 2d-games


【解决方案1】:

查看您的代码,您正在为每个渲染通道计算每个单元格的平方根。

因此,您的代码目前对您渲染的每一帧都涉及超过 22500 次平方根运算,并且正在创建尽可能多的对象,这相当多!

您应该只计算一次六边形的点数。

【讨论】:

  • 好点,我移动了所有的计算,以便在程序启动时只调用一次,但它似乎并没有影响性能。我相信这与我生成多边形的方式有关(不断调用渲染方法,因此每秒生成多次 22500 个多边形)。也许我没有删除旧对象而是填满了内存?不过我真的不确定
  • 你还在用你的渲染方法实例化 PolygonSprites 吗? (阅读 Xoppa 的评论)
  • 是的,我想不出另一种方法来做到这一点,因为我需要不同颜色的多边形,具体取决于地图的内容。编辑:尝试在渲染方法之外将一个 PologonSprite 实例化为黑色并在渲染中调用 polySprite.setColor(color) 但我只得到一张充满黑色多边形的地图。但是,性能问题已经消失了,我只需要一种设置颜色的方法。
  • 将多边形与每种瓷砖类型相关联:为您的“岩石”瓷砖实例化一个多边形,为您的“透明”瓷砖实例化一个多边形。并在必须绘制时根据单元格类型从中选择。你只需要改变多边形的位置,就像你已经在做的那样。
  • 如果您只是需要颜色切换,您还可以通过使用单个多边形并在绘制之前更改批次颜色来进行优化。有很多想法需要探索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2015-04-16
  • 2014-04-16
相关资源
最近更新 更多