我有一个GameScreen,在级别结束后,当用户点击重新启动按钮时,将屏幕重新设置为GameScreen。我执行this.setScreen(new GameScreen(game));,然后执行该行代码之前,我先处理屏幕本身,屏幕中使用的所有纹理,字体文件等,除box2D以外的所有内容(世界,因为处理它会给我带来本机错误并使游戏崩溃)。但是即使我在设置屏幕游戏之前就处置资产,在15-20重新启动后仍然会崩溃。

我通过打印JavaHeap分析了内存使用情况,发现内存使用情况在每次重新启动时都会增加,直到特定时间点,然后再回到低点,如下所示:

- Restart1: 10MB
- Restart2: 13MB
- Restart3: 15MB
- Restart4: 10MB
- Restart5: 11MB
- Restart6: 14MB
- Restart7: 9MB


我已经阅读了有关内存使用的信息,并发现这种行为是正常的。但是仍然几次重启后我的游戏仍然崩溃,甚至没有给出错误信息。

是什么原因造成的?

编辑:我在ZTE Blade上测试了游戏,发现每次重置都会使游戏变慢,但仍然会在15-20次重置时崩溃。

最佳答案

内存上升和下降模式是垃圾回收的标准配置,您只需要担心垃圾回收后开始无法达到先前的低点,因为这将指示内存泄漏。听起来好像有些东西您不需要处理,但是如果要重新加载所有相同的资产,为什么还要处理任何东西呢?

切换到使用AssetManager。如果在AssetManager.load构造函数中调用Screen,在AssetManager.finishLoading方法中调用Screen.show,在AssetManager.unload方法中调用Screen.hide,则由于GameScreen的工作方式,切勿卸载任何AssetManager资产。参考计数,并且只有在导航到其他屏幕时,您才会卸载这些资产。不要忘记在您的`AssetManager.update方法中调用render

10-01 00:25