迷宫绘图(性能更佳)libgdx

时间:2017-05-02 17:56:55

标签: java android performance opengl-es libgdx

在我的游戏中,我正在使用ShapeRenderer类来绘制迷宫。基本上,我使用矩形函数(在ShapeRenderer类中)绘制小黑线。在过去,我在调试游戏性能方面没有问题(fps = 60)。但最近,我遇到了一些性能问题。为了缩短它,我拿出了我在游戏中画出的所有精灵和演员,并决定只绘制迷宫。每次我通过Desktop Launcher调试我的游戏时,fps性能会降低一半(基本上是33,34 fps)。然而,当我运行它时,它会达到60 fps。

我相信这是一个明确的迹象,表明ShapeRenderer类不是我画迷宫性能的最佳选择。我尝试过带有纹理png图像(矩形)的spritebatch并且没有改变任何东西。我想知道是否有更好的选择来绘制迷宫并仍然将fps性能保持在60(在调试模式下),或者调试游戏会将我的fps性能降低一半是正常的吗?

P.S:这是我的代码,它在绘制迷宫的渲染方法中:

for(int x = 0; x < rows; x++){
     for(int y = 0; y < columns; y++){

         if(this.grid[x][y].north.hasWall){ //NORTH BORDER LINE
             shapeRenderer.rect(22+((GENERIC_WIDTH_HEIGHT_MAZE+10)*x), 450-((GENERIC_WIDTH_HEIGHT_MAZE+10)*y), GENERIC_WIDTH_HEIGHT_MAZE+10, 0, color1, color2, color3, color4); 
         }
         if(this.grid[x][y].west.hasWall){ //WEST BORDER LINE
              shapeRenderer.rect(22+((GENERIC_WIDTH_HEIGHT_MAZE+10)*x), 450-((GENERIC_WIDTH_HEIGHT_MAZE+10)*y), 0, -GENERIC_WIDTH_HEIGHT_MAZE-10, color1, color2, color3, color4);
         }
         if(this.grid[x][y].east.hasWall){ //EAST BORDER LINE
                  shapeRenderer.rect(22+((GENERIC_WIDTH_HEIGHT_MAZE+10)*(x+1)), 450-((GENERIC_WIDTH_HEIGHT_MAZE+10)*y), 0, -GENERIC_WIDTH_HEIGHT_MAZE-10, color1, color2, color3, color4);

         }
         if(this.grid[x][y].south.hasWall){ //SOUTH BORDER LINE
              shapeRenderer.rect(22+((GENERIC_WIDTH_HEIGHT_MAZE+10)*x), 450-((GENERIC_WIDTH_HEIGHT_MAZE+10)*(y+1)), GENERIC_WIDTH_HEIGHT_MAZE+10, 0, color1, color2, color3, color4);
         }
     }
 }

任何见解都将不胜感激。是以下值:

GENERIC_WIDTH_HEIGHT_MAZE = 26 (Integer)
rows = 9
columns = 12
color1 = color2 = color3 = color4 = Color.BLACK

2 个答案:

答案 0 :(得分:1)

如果在运行它时渲染速度足够好,那么在调试时我不会担心性能。

但总的来说,这看起来像你可以大大优化的东西:

  1. 由于它是一个迷宫,你可以通过生成“blob”来显着减少绘制调用的次数。您可以加入墙壁,甚至使用三角形条纹来绘制整个块。
  2. 您是否正在使用面部剔除来减少碎片? (你应该)
  3. 无论如何,你很可能不需要绘制所有的墙壁。创建一个系统,只查找不在其他墙后面的墙(应该很简单,因为它看起来像普通的2d网格)。
  4. 减少冗余呼叫:我假设您为每个绘制的矩形设置颜色等内容。只有在需要更换时才尝试这样做。
  5. 迷宫很可能是静止的或很少变化。在加载时使用所有顶点生成GPU缓冲区,然后继续重用该缓冲区以减少到GPU的流量。
  6. 这些只是您可以优化的几个指针,但我会尝试尽可能晚地优化它,并且只在需要时。调试速度太慢通常不是开始优化的好理由。

    由于调试速度慢的原因很多,您可能希望系统能够检查当前的实际绘图FPS。您可以通过将场景绘制到与屏幕大小相同的FBO来测试,并尝试仅在for(或)while循环中绘制场景并测量FPS。这使您可以粗略估计您的极限接近。

答案 1 :(得分:0)

嗯,最后,我做了一个包含绘制的墙壁(小png图片)的TextureAtlas,并调用其中两个(一个水平和垂直)来绘制迷宫并摆脱ShapeRenderer。像DenizYılmaz提到的那样,ShapeRendereris仅用于调试,这可能是for循环中性能降低的原因。我还在代码的其他部分进行了其他一些性能优化。现在性能始终为60 fps。谢谢大家!