Libgdx SpriteBatch实例不再使用后是否需要调用dispose()?

Libgdx SpriteBatch实例不再使用后是否需要调用dispose()?,libgdx,Libgdx,根据,不再需要SpriteBatch实例时需要调用dispose()。然而,当我检查libgdx的一些官方示例(如Pax Britannica和Super Jumper)时,我发现它们从未调用SpriteBatch.dispose()。为什么会这样?我认为给定的演示游戏会尽量让事情简单化。它们应该以极简的方式展示libgdx中的基本内容是如何工作的,从而也抽象出一些细节。这对于初学者来说是非常有用的,因为他们不会用很多非常具体的代码来扩充示例 在一个真实的示例中,我认为必须在SuperJumpe

根据,不再需要
SpriteBatch
实例时需要调用
dispose()
。然而,当我检查libgdx的一些官方示例(如Pax Britannica和Super Jumper)时,我发现它们从未调用
SpriteBatch.dispose()
。为什么会这样?

我认为给定的演示游戏会尽量让事情简单化。它们应该以极简的方式展示libgdx中的基本内容是如何工作的,从而也抽象出一些细节。这对于初学者来说是非常有用的,因为他们不会用很多非常具体的代码来扩充示例

在一个真实的示例中,我认为必须在SuperJumper中的
GameScreen
dispose()
方法中调用
SpriteBatch.dispose()
。当切换回
MainMenuScreen
时,还必须调用
GameScreen.dispose()
,因为这不会自动发生


当创建这样的Spritebatch
新Spritebatch()
时,它会创建一个内部
网格。不调用SpriteBatch.dispose()
时,这一个网格也不会被释放,因此SuperJumper在那里有内存泄漏。

SpriteBatch
必须始终被释放

在内部,它创建并管理多个
网格
对象。这些对象在GPU上分配顶点/索引数组。只有在显式调用
Mesh#dispose()
时,才会解除分配这些文件,这将通过在SpriteBatch对象上调用
dispose()
触发

默认情况下,它还将创建自己的
着色器程序
。同样,如果您没有调用
dispose()
,则会泄漏


如果演示没有这样做,也许是时候发送拉请求了

我创建了多个屏幕的游戏,每个屏幕都有自己的SpriteBatch。我刚刚删除了批处理的所有dispose()方法,对我来说,这没有任何影响。因此,在发布产品之前,请记住检查这些信息。即使您觉得不处理批次没有任何负面影响,也没有理由不处理它们。只需在屏幕上执行即可。执行dispose方法大约需要1纳秒:)

您如何知道“它甚至可能没有任何可能导致内存泄漏的资源”?我想根据我发表的那篇文章,
SpriteBatch
本身就是一种资源?“
libgdx中有多个类表示此类资源。
”@HảiPhong嗯,
SpriteBatch
本身只是一个标准的Java对象。当它不再被引用时,垃圾收集器将完全清除它。大多数情况下,只有将资源上载到图形卡时才会出现问题,这里最简单的例子就是纹理。一旦GC清理对象,这些资源不会自动重置。另一个例子是Box2D
World
。这里我们使用JNI调用C++代码,其中Gababe收集器不存在。我只是快速查看了
SpriteBatch.dispose()
所做工作的源代码,似乎没有必要。好的,我了解
SpriteBatch
。但是
Texture
TextureAtlas
BitmapFont
呢?它们包含纹理,这意味着这些类必须始终调用
dispose()
对吗?是的,但我建议您对这些类使用
AssetManager
SpriteBatch
包含多个
Mesh
对象,这些对象本身分配顶点/索引数组。这些都分配在图形内存中。如果您没有正确地处理SpriteBatch,那么将永远不会调用
Mesh#dispose()
,并且您将在GPU上泄漏这些阵列。