我有一个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
。