libgdx中的fPS在一个简单的游戏中降到了20

时间:2015-09-04 21:38:49

标签: java libgdx

我试图保持60的FPS。然而,当我运行我的游戏时,它下降到大约16到20 FPS。我似乎找到了问题,但我无法弄清楚为什么它是一个问题以及如何解决它。问题在于我的网格渲染方法(我的游戏使用2d布尔数组进行碰撞)。我在我的渲染方法中使用一个双循环来绘制网格本身(用于调试目的)和另一个双循环绘制网格中真实元素的位置(可以与谎言碰撞的东西)。奇怪的是,它们基本上做了完全相同的事情,但是通过注释掉上层循环,它没有修复它,但是注释掉了下层循环。这是更好理解的代码。

这是完整的渲染方法

    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);
            }
        }
    }


}

现在,如果我要在第二个双for循环中注释掉3个render.line方法,那么没有问题,完整的60 FPS工作正常。但是,如果我注释掉第一个循环,我的FPS下降到16 FPS。由于这仅用于调试,我知道我可以删除它,但是我的游戏将处于调试模式已有相当长的一段时间,并且使其顺利运行几乎是必不可少的。

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

在帮助我解决这个问题时,非常感谢任何帮助。谢谢!

编辑:我每次都通过top语句运行if语句,然后评论第二个语句并且仍然保持60 FPS所以我不相信它是if语句

1 个答案:

答案 0 :(得分:1)

你的第二个循环有第一个循环中缺少的多个乘法。乘法几乎总是比加法慢很多。我找到了一种优化方法;也许预先计算它们或使用类似的循环到第一个循环。