我一直在研究内存泄漏,我很困惑为什么应该调用SpriteBatch.dispose()
。我想当你运行spriteBatch.begin()
和spriteBatch.end()
时,这足以防止内存泄漏等。
答案 0 :(得分:4)
不,begin()
和end()
与dispose
方法非常不同。
你对dispose
方法的行为是正确的。
释放此对象的所有资源。
begin()
和end()
用于设置相关的Batch
进行渲染,请注意您可以绘制多个批次。批处理上的所有绘制调用必须在begin
和end
方法之间完成。它们与释放内存无关,因此如果你愿意,你需要做dispose()
。
答案 1 :(得分:3)
你绝对不想要每帧或每end
之后处理它。它不会积累。完成批处理后,您需要处理它(最有可能在关闭应用程序或更改Screen
时)
答案 2 :(得分:2)
SpriteBatch.end()
完成渲染。启用深度写入,禁用混合和纹理。
SpriteBatch.dispose()
实际上释放了此对象的所有资源,并防止内存泄漏。
因此,在使用SpriteBatch.end()
之后,项目可能会保留在内存中,具体取决于代码的其他方面,特别是如果您想稍后再次使用它。因此,当您完全使用SpriteBatch时,应始终调用dispose,否则无法保证释放内存。
答案 3 :(得分:1)
需要处理一次性资源但在哪里?
如果您使用SpriteBatch
create()
ApplicationListener
方法创建dispose()
并在不同屏幕上的游戏中使用它,请将它们置于ApplicationListener' s show()
方法。
否则,如果您在屏幕的dispose()
方法中创建,则在Screen的hide()
方法中处置但处理方法不是由ApplicationListener或Framework调用的,所以你需要自己调用dispose方法,所以从Screen的begin()
方法调用dispose方法。
end()
和SpriteBatch
方法用于实现{{1}}的目的:
将多个精灵批处理为单个绘制调用,以最大限度地减少每个绘制调用的相关性能损失。