Java 加载数千个对象后,我的帧速率下降,如何处理
我正在制作一个Terraria的副本,显然有一个下面的区域,可以装载数千个“泥土”物体。然而,这导致我的FPS大幅下降。我在网上搜索过,但由于我的具体问题,我找不到任何解决方案。我尝试只渲染100个块,只渲染屏幕上的内容,但是即使渲染了300个左右的块,我的FPS也会下降到20。我的游戏看起来像这样 (仅呈现所看到的内容) 总共有4个不同的图像,运行该图像的代码如下所示Java 加载数千个对象后,我的帧速率下降,如何处理,java,libgdx,Java,Libgdx,我正在制作一个Terraria的副本,显然有一个下面的区域,可以装载数千个“泥土”物体。然而,这导致我的FPS大幅下降。我在网上搜索过,但由于我的具体问题,我找不到任何解决方案。我尝试只渲染100个块,只渲染屏幕上的内容,但是即使渲染了300个左右的块,我的FPS也会下降到20。我的游戏看起来像这样 (仅呈现所看到的内容) 总共有4个不同的图像,运行该图像的代码如下所示 public void render() { fps.log(); collisionHandler
public void render() {
fps.log();
collisionHandler.run();
// collisionHandler.update();
player.update();
camera.update();
mapGrid.update();
Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);
batch.setShader(null);
batch.begin();
batch.draw(background, 0, 0, Gdx.graphics.getWidth(),
Gdx.graphics.getHeight());
batch.end();
mapGrid.drawGrid(renderer);
batch.setShader(null);
player.draw(batch, renderer);
ground.update(batch);
ground1.update(batch);
for (int i = 0; i < groundList.size(); i++){
groundList.get(i).update(batch);
shader.begin();
shader.setUniformf("u_resolution", groundList.get(i).getPosition());
shader.end();
}
//batch.setShader(shader);
for (int i = 0; i < dirtList.size(); i++)
// update means render*** dirtList consists of dirt objects!
dirtList.get(i).update(batch);
}
public void render(){
fps.log();
collisionHandler.run();
//collisionHandler.update();
player.update();
camera.update();
update();
Gdx.gl.glClear(GL30.gl\u颜色\u缓冲\u位);
batch.setShader(空);
batch.begin();
batch.draw(背景,0,0,Gdx.graphics.getWidth(),
graphics.getHeight());
batch.end();
drawGrid(渲染器);
batch.setShader(空);
绘制(批处理、渲染器);
地面更新(批量);
1.更新(批量);
对于(int i=0;i
我曾尝试将这些对象存储在池或缓存中,但似乎没有什么能将FPS提高到60。请帮助任何帮助或指导将不胜感激 每帧要渲染多少污垢对象?如果它像你说的那样成千上万,我会说这是你的问题 池/缓存无法在此处固定您的帧速率。它只会在创建/销毁所有污垢对象时帮助您进行内存管理
如果您了解GLSL的使用方法,您实际上可以一次渲染所有这些污垢块,而不是数千次。这是一种解决方案。最好使用重复纹理或其他可以同时绘制的大簇。例如,如果有一个由10*15个块组成的矩形簇,而不是逐个绘制150个块,只需使用相同的重复纹理填充这些块即可。当玩家与它们交互时,将其分解为更小的集群 在您发布的屏幕截图中,所有污垢块都可以绘制为单个块。如果其中任何一个断开,只需重新计算大矩形区域,并绘制新的较小簇
您可以做的一件事是对代码进行一点基准测试,这就是我为我的引擎所做的。将有用的计时器和有用的文本放在各处,并打印每个操作的时间。你可能会很快发现你的瓶颈!我也不知道你在做什么(我是用C++做的),但常见的错误是循环速度太快,在某个地方阻塞IO,一个每次运行一次就可以运行的算法等等!祝你好运谢谢,我会调查的@PierreThe
SpriteBatch
可以存储许多drawCall,然后将它们作为一个drawCall刷新到GPU。这可以提高性能,因为DrawCall是相当繁重的操作。调用batch..end()
和batch.flush()
将把东西刷新到GPU。因此,请确保只在真正需要时调用此方法。因此,请确保渲染代码中没有太多的batch.end()
调用。从我看到的情况来看,您必须在ground.update(batch)
内部调用batch.begin()
和end()
,因此这很可能是问题所在。因为只有一堆重复的纹理,您应该改用。