根据这篇文章,一旦不再需要SpriteBatch
实例,就需要调用它。dispose()
但是,当我检查一些 libgdx 的官方示例(例如 Pax Britannica 和 Super Jumper)时,我发现它们从不调用SpriteBatch.dispose()
. 这是为什么?
3 回答
SpriteBatch
必须始终处置。
在内部,它创建和管理多个Mesh
对象。这些对象在 GPU 上分配顶点/索引数组。仅当您显式调用时才会解除分配Mesh#dispose()
,这将通过调用dispose()
您的 SpriteBatch 对象来触发。
默认情况下,它还将创建自己的ShaderProgram
. 同样,如果您不调用dispose()
.
如果演示没有这样做,也许是时候发送拉取请求了!
我认为给定的演示游戏试图让事情变得简单。它们应该以简约的方式展示 libgdx 中的基本内容如何工作,因此也抽象了一些细节。这对于初学者不要用大量非常具体的代码膨胀示例很有用。
在一个真实的例子中,我认为SpriteBatch.dispose()
必须在 SuperJumper的dispose()
方法中调用。GameScreen
并且GameScreen.dispose()
在切换回 时也必须调用MainMenuScreen
,因为这也不会自动发生。
当像这样创建 Spritebatch 时new SpriteBatch()
,它会创建一个内部Mesh
。当不调用SpriteBatch.dispose()
这个网格时,也不会被处理,因此 SuperJumper 那里有内存泄漏。
我创建了多个屏幕的游戏,这些屏幕都有自己的 SpriteBatch。我刚刚删除了批次的所有 dispose() 方法,对我来说,这没有任何影响。因此,请记住在发布您的产品之前检查这一点。即使不处理批次您感觉不到任何不利因素,也没有理由不处理它们。只需在 Screen implementationentations dispose 方法上执行此操作,大约需要 1 纳秒:)