渲染平铺图时SpriteBatch性能差[LibGDX]



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

问题是,当渲染纹理到这个SpriteBatch时,我得到了可怕的性能。我不确定这是由投影矩阵引起的(需要将我的64x64纹理缩放到1x1的批量尺寸),还是其他东西。

我试过运行程序而不执行批处理。在渲染器中调用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值不是,这就是为什么需要一个数组。

编辑:不知怎么的性能是伟大的,如果相机缩小,不知道为什么这是。这肯定和相机的尺寸有关。

找到了答案,它实际上与所有东西背后的图形有关。我注意到,当我进行压力测试时,我的电脑(mac)会因为图形问题而关闭。

基本上可以归结为这一行:cfg。useHDPI = true;

我让我的LwjglApplicationConfiguration使用高清像素,我猜我的电脑无法处理它时,它必须处理太多的高清像素(这就是为什么它工作时,我缩放相机,更少的像素)

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

我对你的代码所做的一切并不完全肯定,但看起来最外层的循环运行时为0(56),内部的for循环运行时为另一个O(56),然后最内部的foreach循环运行时为0 (<# of elements in tiles>),给你总共:大约3000个绘制调用,假设在tiles中有一个元素。

这已经是相当大的绘图了,更不用说缩放通常会带来的性能下降。没有办法优化吗?

相关内容

  • 没有找到相关文章

最新更新