LibGDX:为所有东西保留1个SpriteBatch并且不处理它会有什么危害?

时间:2017-06-15 03:11:02

标签: java libgdx

我一直在研究内存泄漏,我很困惑为什么应该调用SpriteBatch.dispose()。我想当你运行spriteBatch.begin()spriteBatch.end()时,这足以防止内存泄漏等。

4 个答案:

答案 0 :(得分:4)

不,begin()end()dispose方法非常不同。

根据documentation

你对dispose方法的行为是正确的。

  

释放此对象的所有资源。

begin()end()用于设置相关的Batch进行渲染,请注意您可以绘制多个批次。批处理上的所有绘制调用必须在beginend方法之间完成。它们与释放内存无关,因此如果你愿意,你需要做dispose()

答案 1 :(得分:3)

你绝对想要每帧或每end之后处理它。它不会积累。完成批处理后,您需要处理它(最有可能在关闭应用程序或更改Screen时)

答案 2 :(得分:2)

SpriteBatch.end()完成渲染。启用深度写入,禁用混合和纹理。

SpriteBatch.dispose()实际上释放了此对象的所有资源,并防止内存泄漏。

因此,在使用SpriteBatch.end()之后,项目可能会保留在内存中,具体取决于代码的其他方面,特别是如果您想稍后再次使用它。因此,当您完全使用SpriteBatch时,应始终调用dispose,否则无法保证释放内存。

答案 3 :(得分:1)

需要处理一次性资源但在哪里?

  1. 如果您使用SpriteBatch create() ApplicationListener方法创建dispose()并在不同屏幕上的游戏中使用它,请将它们置于ApplicationListener' s show()方法。

  2. 否则,如果您在屏幕的dispose()方法中创建,则在Screen的hide()方法中处置但处理方法不是由ApplicationListener或Framework调用的,所以你需要自己调用dispose方法,所以从Screen的begin()方法调用dispose方法。

  3. end()SpriteBatch方法用于实现{{1}}的目的:

    将多个精灵批处理为单个绘制调用,以最大限度地减少每个绘制调用的相关性能损失。