我有一个 GameScreen
在关卡结束后,我把屏幕调回 GameScreen
当用户点击重启按钮时作为重启。我这样做 this.setScreen(new GameScreen(game));
在我做这行代码之前,我先处理屏幕本身,屏幕中使用的所有纹理,字体文件等等,除了box2d以外的所有东西(因为处理它会给我带来本地错误,使游戏崩溃)。但即使我在设置屏幕前处理资产,游戏在15-20次重启后仍然崩溃。
我通过打印javaheap分析了内存使用情况,发现momory的使用情况在每次重新启动时都会增加,直到某个点,然后回到低点,如下所示:
- Restart1: 10MB
- Restart2: 13MB
- Restart3: 15MB
- Restart4: 10MB
- Restart5: 11MB
- Restart6: 14MB
- Restart7: 9MB
我读过关于内存使用的文章,发现这种行为很正常。但我的游戏还是在几次重启后崩溃了,甚至没有给出错误信息。
是什么原因造成的?
编辑:我在中兴blade上测试了这款游戏,发现每次重置都会让游戏变慢,但在大约15-20次重置后仍然会崩溃。
2条答案
按热度按时间v9tzhpje1#
你可能已经解决了你的问题,因为它已经快一年了,但我会把这个放在这里无论如何,希望它可以帮助人们谁是寻找解决这种错误的方法。
我的一个应用程序也有类似的机制,我也经历了box2d world的本地崩溃。那是我在处理完原来的游戏后使用setscreen(newgamescreen(game))的时候。
我以前的初始化方式如下:
结果我不得不在构造函数中初始化世界。现在,无论我处理和重新创建了多少次,我都可以在没有任何崩溃的情况下完成以下工作:
我不确定这是否也是你的原因,但这只是另一个建议。
r9f1avp52#
内存上下模式是垃圾收集的标准模式,您只需担心在垃圾收集之后它是否开始无法达到之前的低点,因为这将表明内存泄漏。听起来可能有些东西你没有处理,但为什么你要处理任何东西,如果你只是要重新加载所有相同的资产?
切换到使用
AssetManager
. 如果你打电话AssetManager.load
在你的Screen
建造师,AssetManager.finishLoading
在你的Screen.show
方法和AssetManager.unload
在你的Screen.hide
方法你不应该卸下你的任何东西GameScreen
资产因为什么AssetManager
进行引用计数,只有在导航到其他屏幕时才卸载这些资产。别忘了打电话 ``AssetManager.update在你的
render` 方法。