Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迷宫绘图(性能更好)libgdx_Java_Android_Performance_Opengl Es_Libgdx - Fatal编程技术网

Java 迷宫绘图(性能更好)libgdx

Java 迷宫绘图(性能更好)libgdx,java,android,performance,opengl-es,libgdx,Java,Android,Performance,Opengl Es,Libgdx,在我的游戏中,我使用ShaperEnder类绘制迷宫。基本上,我使用矩形函数(在ShaperEnder类中)绘制小黑线。在过去,我在调试游戏性能方面没有问题(fps=60)。但最近,我遇到了一些性能问题。简而言之,我拿出了我在游戏中画的所有精灵和演员,决定只画迷宫。每次我通过桌面启动器调试游戏时,fps性能都会降低一半(基本上是33,34 fps左右)。然而,当我运行它时,它会上升到每秒60帧 我相信这清楚地表明ShaperEnder类不是我绘制迷宫性能图的最佳选择。我试过使用带有纹理png图像

在我的游戏中,我使用ShaperEnder类绘制迷宫。基本上,我使用矩形函数(在ShaperEnder类中)绘制小黑线。在过去,我在调试游戏性能方面没有问题(fps=60)。但最近,我遇到了一些性能问题。简而言之,我拿出了我在游戏中画的所有精灵和演员,决定只画迷宫。每次我通过桌面启动器调试游戏时,fps性能都会降低一半(基本上是33,34 fps左右)。然而,当我运行它时,它会上升到每秒60帧

我相信这清楚地表明ShaperEnder类不是我绘制迷宫性能图的最佳选择。我试过使用带有纹理png图像(矩形)的spritebatch,但没有改变任何事情。我想知道是否有更好的选择来绘制迷宫,并且仍然将fps性能保持在60(在调试模式下),或者调试游戏会将fps性能降低一半是正常的吗

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

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

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

但总的来说,这看起来像是可以极大优化的:

  • 由于它是一个迷宫,您可以通过生成“blob”显著减少draw调用的数量。您可以连接墙,甚至可以使用三角形条纹绘制整个块
  • 您是否使用面剔除来减少碎片数量?(你应该)
  • 你很可能不需要画所有的墙。创建一个系统以仅查找不在其他墙后面的墙(应该很容易,因为它看起来像普通的二维栅格)
  • 减少冗余调用:我假设您一直在为您绘制的每个矩形设置颜色之类的内容。只有在需要改变的时候才尝试这样做
  • 迷宫很可能是静态的或很少变化。使用所有顶点在加载时生成GPU缓冲区,然后继续重用该缓冲区以减少到GPU的流量
  • 同样,这些只是一些可以优化的指针,但我会尽可能晚地优化它,并且只有在需要的时候。调试速度太慢通常不是开始优化的好理由


    由于调试缓慢的原因可能有很多,因此您可能需要一个系统来检查当前实际的图形FPS。您可以通过将场景绘制到与屏幕大小相同的FBO来测试这一点,并尝试在for(或)while循环和测量FPS中继续绘制场景。这会让你粗略估计你离极限有多近

    最后,我制作了一个包含绘制的墙(小png图片)的TextureAtlas,并调用其中两个(一个水平,一个垂直)来绘制迷宫并去掉ShaperEnder。正如Deniz Yılmaz提到的,ShaperEnderis仅用于调试,这可能就是为什么for循环中的性能会降低。我还对代码的其他部分进行了一些其他性能优化。现在的表现是在60 fps的所有时间。谢谢大家

    提供更多上下文,例如行值、高度、通用宽度高度迷宫和其他可能相关的信息。有人有任何线索吗?请提供完整的render()方法。实际上,render()方法中只有这些内容。除此之外别无选择。您忘记清除backbuffer,这会导致gpu每次都重新构建backbuffer。您应该添加类似Gdx.gl.glClear(…)的内容。此外,您从未调用shaperender.begin/end,也从未设置投影矩阵。因此,这根本不可能显示任何内容。@Matic Oblak:#2)面对淘汰会做什么?据我所知,它只用于3d形状。我只是在展示一个二维迷宫。5) 如何生成GPU缓冲区?你有链接或教程,我可以按照这样做吗?1) 我怎么能做到呢?
    GENERIC_WIDTH_HEIGHT_MAZE = 26 (Integer)
    rows = 9
    columns = 12
    color1 = color2 = color3 = color4 = Color.BLACK