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