一旦SpriteBatch实例不再使用,它​​是否需要调用dispose()?

时间:2013-11-08 06:27:03

标签: libgdx

根据this articleSpriteBatch实例需要在不再需要时调用dispose()。但是,当我查看一些libgdx的官方例子,如Pax Britannica和Super Jumper时,我发现他们从不打电话给SpriteBatch.dispose()。那是为什么?

3 个答案:

答案 0 :(得分:5)

必须始终处理

SpriteBatch

在内部,它创建并管理多个Mesh个对象。这些对象在GPU上分配顶点/索引数组。如果您明确调用Mesh#dispose(),那么这些只会被解除分配,这将通过调用SpriteBatch对象上的dispose()来触发。

默认情况下,它还会创建自己的ShaderProgram。同样,如果您没有致电dispose(),也会泄露。

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

答案 1 :(得分:1)

我认为给定的演示游戏试图让事情变得简单。他们应该展示libgdx中的基本内容如何以简约的方式工作,从而也抽象出一些细节。这对初学者来说非常有用,可以用很多非常具体的代码来夸大这些例子。

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

创建像此MainMenuScreen这样的Spritebatch时,会创建一个内部new SpriteBatch()。当不调用Mesh时,这个网格也不会被丢弃,因此SuperJumper会在那里发生内存泄漏。

答案 2 :(得分:0)

我创建的游戏中有多个屏幕都有自己的SpriteBatch。我刚刚删除了批次的所有dispose()方法,对我来说,这没有任何影响。因此,在发布产品之前,请记住检查这一点。即使你不能感觉到任何不能处理批次的缺点,也没有理由不处理它们。只需在屏幕上实现配置处理方法,需要大约1纳秒才能完成:)