有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在一个简单的游戏中,libgdxjava中的FPS下降到20

我试图保持60的FPS。然而,当我运行我的游戏,它下降到约16-20 FPS。我似乎已经发现了问题,但我就是不明白为什么它是一个问题,以及如何解决它。问题在于我的网格渲染方法(我的游戏使用2d布尔数组进行碰撞)。我在渲染方法中使用一个双for循环来绘制网格本身(出于调试目的),另一个双for循环来绘制网格中真实元素的位置(可以与谎言发生冲突的地方)。奇怪的是,它们本质上做了完全相同的事情,但通过注释掉上面的循环,它不会修复它,但是注释掉下面的循环会修复它。下面是更好理解的代码

下面是完整的渲染方法

    public void render(ShapeRenderer render){

    render.setColor(Color.WHITE);
    for(int x = 0; x < mapGrid.length; x+= CELL_SIZE){
        for(int y = 0; y < mapGrid[x].length; y+= CELL_SIZE){
            render.line(x, y, x + CELL_SIZE, y);
            render.line(x + CELL_SIZE, y, x + CELL_SIZE, y + CELL_SIZE);
            render.line(x + CELL_SIZE, y + CELL_SIZE, x, y + CELL_SIZE);
        }
    }

    render.setColor(Color.RED);
    for(int x = 0; x < mapGrid.length; x++){
        for(int y = 0; y < mapGrid[x].length; y++){
            if(mapGrid[x][y]){
                render.line(x * CELL_SIZE, y * CELL_SIZE,x * CELL_SIZE + CELL_SIZE, y * CELL_SIZE);
                render.line(x * CELL_SIZE + CELL_SIZE, y * CELL_SIZE, x * CELL_SIZE + CELL_SIZE, y * CELL_SIZE + CELL_SIZE);
                render.line(x * CELL_SIZE + CELL_SIZE, y * CELL_SIZE + CELL_SIZE, x * CELL_SIZE, y * CELL_SIZE + CELL_SIZE);
            }
        }
    }


}

现在,如果我要注释掉3渲染。线路方法在第二双换回路,没有问题,满60 FPS工作良好。然而,如果我注释掉第一个循环,我的FPS将下降到16 FPS。由于这只是用于调试,我知道我可以删除它,但是我的游戏将在调试模式下运行相当长的一段时间,让它顺利运行实际上是至关重要的

两个循环的唯一区别是第二个double for循环中的one if语句,循环稍长,但在游戏中,第二个for循环只渲染了3个东西,因为此时只有3个平台被渲染。如果If语句确实是问题所在,我需要知道如何解决它。我只是不明白为什么我的FPS下降得这么厉害

非常感谢您能帮我解决这个问题。谢谢大家!

编辑:我每次都在最上面的语句中运行一条if语句,并注释掉第二条语句,但仍然保持60 FPS,所以我不相信它是if语句


共 (1) 个答案

  1. # 1 楼答案

    你的第二个循环有很多倍数,而第一个循环没有。乘法几乎总是比加法慢得多。我会找到一种优化的方法;也许是预先计算它们,或者使用与第一个循环类似的循环