7

根据这篇文章,一旦不再需要SpriteBatch实例,就需要调用它。dispose()但是,当我检查一些 libgdx 的官方示例(例如 Pax Britannica 和 Super Jumper)时,我发现它们从不调用SpriteBatch.dispose(). 这是为什么?

4

3 回答 3

5

SpriteBatch必须始终处置。

在内部,它创建和管理多个Mesh对象。这些对象在 GPU 上分配顶点/索引数组。仅当您显式调用时才会解除分配Mesh#dispose(),这将通过调用dispose()您的 SpriteBatch 对象来触发。

默认情况下,它还将创建自己的ShaderProgram. 同样,如果您不调用dispose().

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

于 2013-11-08T15:09:34.537 回答
1

我认为给定的演示游戏试图让事情变得简单。它们应该以简约的方式展示 libgdx 中的基本内容如何工作,因此也抽象了一些细节。这对于初学者不要用大量非常具体的代码膨胀示例很有用。

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

当像这样创建 Spritebatch 时new SpriteBatch(),它会创建一个内部Mesh。当不调用SpriteBatch.dispose()这个网格时,也不会被处理,因此 SuperJumper 那里有内存泄漏。

于 2013-11-08T06:52:03.810 回答
0

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

于 2014-05-12T11:47:57.413 回答