Java 加载数千个对象后,我的帧速率下降,如何处理

Java 加载数千个对象后,我的帧速率下降,如何处理,java,libgdx,Java,Libgdx,我正在制作一个Terraria的副本,显然有一个下面的区域,可以装载数千个“泥土”物体。然而,这导致我的FPS大幅下降。我在网上搜索过,但由于我的具体问题,我找不到任何解决方案。我尝试只渲染100个块,只渲染屏幕上的内容,但是即使渲染了300个左右的块,我的FPS也会下降到20。我的游戏看起来像这样 (仅呈现所看到的内容) 总共有4个不同的图像,运行该图像的代码如下所示 public void render() { fps.log(); collisionHandler

我正在制作一个Terraria的副本,显然有一个下面的区域,可以装载数千个“泥土”物体。然而,这导致我的FPS大幅下降。我在网上搜索过,但由于我的具体问题,我找不到任何解决方案。我尝试只渲染100个块,只渲染屏幕上的内容,但是即使渲染了300个左右的块,我的FPS也会下降到20。我的游戏看起来像这样 (仅呈现所看到的内容)

总共有4个不同的图像,运行该图像的代码如下所示

    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()
,因此这很可能是问题所在。因为只有一堆重复的纹理,您应该改用。