根据this article,SpriteBatch
实例需要在不再需要时调用dispose()
。但是,当我查看一些libgdx的官方例子,如Pax Britannica和Super Jumper时,我发现他们从不打电话给SpriteBatch.dispose()
。那是为什么?
答案 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纳秒才能完成:)