Java LibGDX:为所有东西保留一个SpriteBatch而不处理它有什么害处?

Java LibGDX:为所有东西保留一个SpriteBatch而不处理它有什么害处?,java,libgdx,Java,Libgdx,我一直在研究内存泄漏,我不明白为什么应该调用SpriteBatch.dispose()。我想当您运行spriteBatch.begin()和spriteBatch.end()时,这足以防止内存泄漏之类的情况 否,begin()和end()与dispose方法非常不同 据报道, 关于dispose方法的行为,您是对的 释放此对象的所有资源 begin()和end()用于为渲染设置关联的批处理,请注意,可以有多个批处理绘制。批处理上的所有绘图调用必须在begin和end方法之间完成。它们与释放内存无

我一直在研究内存泄漏,我不明白为什么应该调用
SpriteBatch.dispose()
。我想当您运行
spriteBatch.begin()
spriteBatch.end()
时,这足以防止内存泄漏之类的情况

否,
begin()
end()
dispose
方法非常不同

据报道,

关于
dispose
方法的行为,您是对的

释放此对象的所有资源

begin()
end()
用于为渲染设置关联的
批处理,请注意,可以有多个批处理绘制。批处理上的所有绘图调用必须在
begin
end
方法之间完成。它们与释放内存无关,因此,如果希望这样做,则需要执行
dispose()

SpriteBatch.end()
完成渲染。启用深度写入,禁用混合和纹理

SpriteBatch.dispose()
实际上释放此对象的所有资源,并防止内存泄漏


因此,在使用
SpriteBatch.end()
之后,该项可能会保留在内存中,具体取决于代码的其他方面,特别是如果您希望以后再次使用它。因此,当您完成SpriteBatch时,应该始终调用dispose,否则无法保证内存将被释放。

您肯定不希望在每帧或每
结束后都对其进行处理。它不会堆积起来。使用完批处理后,您希望处置它(最有可能是在关闭应用程序或更改
屏幕时)

需要处置可处置资源,但在何处处置

  • 如果您正在
    ApplicationListener
    create()
    方法中创建您的
    SpriteBatch
    ,并在不同的屏幕上在整个游戏中使用它,请使用ApplicationListener的
    dispose()
    方法处理它们

  • 否则,如果您正在Screen的
    show()
    方法中创建dispose,那么请在Screen的
    dispose()
    方法中进行dispose,但dispose方法不是由ApplicationListener或Framework调用的,因此您需要自己调用dispose方法,所以从Screen的
    hide()
    方法调用dispose方法

  • begin()
    end()
    方法用于实现
    SpriteBatch
    的目的:


    将多个精灵批处理到单个绘图调用中,以最小化每个绘图调用的相关性能损失。

    因此,如果我不调用
    dispose()
    ,以前绘图中的信息是否会累积?如果反复使用同一个精灵批,则不会累积。但是如果你每次都创建一个新的,那么它就会建立起来。我想我会问你和我问Sorifind一样的问题:如果我不调用dispose(),以前的绘图中的信息会建立起来吗?这里有所有好的答案,我想你的问题已经得到了回答。但是,如果您仍然有点不正常,请查看SpriteBatch的dispose()方法的代码。当begin()和end()被反复用于渲染时,dispose()会在不再需要SpriteBatch进行渲染时,删除SpriteBatch用于渲染的内部构件(需要释放的内部构件-Mesh,可能还有一个着色器):@Override public void dispose(){Mesh.dispose();if(ownsShader&&Shader!=null)shader.dispose();}