【问题标题】:FPS in libgdx java dropping to 20 in a simple gamelibgdx java中的FPS在一个简单的游戏中下降到20
【发布时间】:2015-09-05 05:48:03
【问题描述】:

我试图将 FPS 保持在 60。但是当我运行我的游戏时,它会下降到大约 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 下降得这么厉害。

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

编辑:我每次都通过顶部语句运行一个 if 语句,并将第二个注释掉,但仍然保持 60 FPS,所以我不相信它是 if 语句

【问题讨论】:

  • 不,@Alex 我运行了一个 if 通过顶部的循环,如果第二个循环被评论,则得到 60 FPS,看看编辑

标签: java libgdx


【解决方案1】:

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

【讨论】:

  • 我将如何预先计算它们?他们可能正在移动
  • 什么可能在移动? x 和 y 可预测且重复地“移动”,如果您使用常规 java 习惯用法命名事物,CELL_SIZE 应该是一个常量。尝试将 x 和 y 增加 CELL_SIZE 的倍数而不是 1。
  • 预计算是指将这些位置存储在我的创建方法中吗?
  • 由于您的回答,将第二个循环减少到单个 for 循环中的 4 次迭代,谢谢!
  • 当前mapGrid[x][y] 持有一个布尔值。您可以改为让它保存一个布尔数组和预先计算的值x * CELL_SIZEy * CELL_SIZE,然后只需将这些值插入到render.line() 的调用中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
相关资源
最近更新 更多