渲染tilemap时的糟糕SpriteBatch性能[LibGDX]

时间:2015-06-03 22:26:51

标签: java libgdx rendering isometric spritebatch

所以我使用我创建的等距渲染器类渲染一个tilemap(只是一个带有MapTiles的二维数组),称为WorldGeneration。我正在使用的相机每米使用64像素,因此它的高度例如是:(游戏窗口高度)/ 64。等距渲染器中使用的SpriteBatch将其投影矩阵设置为此摄像机。 (batch.setProjectionMatrix(cam.combined)

问题是,在这个SpriteBatch上渲染纹理时,我的表现很糟糕。我不确定它是否是由投影矩阵造成的(需要在批量维度中将我的64x64纹理缩放到1x1),或者别的什么。

我试过运行程序而不在渲染器中执行batch.draw调用(参见下面的代码),一切正常。有人能找到问题或给我一些提示吗?

相关代码段:

等距渲染器的渲染方法:

public void render(WorldGeneration gen) {
    //TODO compensate for elevation
    int x1 = (int) (cameraIso.x - 23); // TODO compensate for zoom
    int x2 = (int) (cameraIso.x + 23);
    int y1 = (int) (cameraIso.y - 23);
    int y2 = (int) (cameraIso.y + 23);

    if(x1 < 0){
        x1 = 0;
    }else if(x1 >= gen.getLengthX()){
        x1 = gen.getLengthX() - 1;
    }

    if(y1 < 0){
        y1 = 0;
    }else if(y1 >= gen.getLengthY()){
        y1 = gen.getLengthY() - 1;
    }

    if(x2 < 0){
        x2 = 0;
    }else if(x2 >= gen.getLengthX()){
        x2 = gen.getLengthX() - 1;
    }

    if(y2 < 0){
        y2 = 0;
    }else if(y2 >= gen.getLengthY()){
        y2 = gen.getLengthY() - 1;
    }

    batch.begin();
    for (int x = x2; x >= x1; x--) {
        for (int y = y2; y >= y1; y--) {
            tiles = gen.getTiles(x, y);
            if(tiles == null){
                continue;
            }else if(tiles.size <= 0){
                continue;
            }
            for(MapTile tile: tiles){
                if(tile.getOpacity() < 1){
                    batch.setColor(batchColor.r, batchColor.g, batchColor.b, tile.getOpacity());
                }else{
                    batch.setColor(batchColor.r, batchColor.g, batchColor.b, 1);
                }
                //TODO only visible (not underneath several tiles)
                pos.x = x;
                pos.y = y;

                //As you can see the texture is scaled to 1x1 because of batch:
                batch.draw(textures[tile.getId()], translateCartToIso(pos).x,
                        translateCartToIso(pos).y + tile.getZ(), 1f, 1f);

            }
        }
    }
    batch.end();
}

正如你所看到的,我甚至在渲染方法之外创建了Vector2 pos以提高性能,但我不确定这是否是必要的。值得注意的是,tile被锁定到xy网格,但是它们的z值不是,这就是需要数组的原因。

编辑:如果相机缩小,不知何故,性能会很好,不知道为什么会这样。它肯定与相机尺寸有关。

2 个答案:

答案 0 :(得分:1)

找到答案,它实际上与一切背后的图形有关。我注意到,当我运行压力测试时,我的计算机(mac)会因图形问题而关闭。

它基本上归结为这一行: cfg.useHDPI = true;

我将LwjglApplicationConfiguration用于高清像素时,我想我的计算机无法处理过多的高清像素(这就是为什么当我缩小相机时它的工作原理,更少的像素) )

我想我现在必须处理一些扭曲的像素,这是我以后必须解决的问题!

答案 1 :(得分:0)

我对你的代码所做的一切并不完全正面,但看起来最外层循环的运行时为O(56),内部for循环有另一个O(56)运行时,然后是最里面的foreach循环的运行时间为O(&lt; tile中的元素数量&gt;),总计大约为3,000次绘制调用,假设tile中有一个元素。

已经相当多的绘图,更不用说性能降低缩放通常可以传达。有没有办法优化它?