要在我的游戏中切换级别,我会重新创建我的GameScene,但是当我切换水平大约3或4次时,我得到一个错误的12内存错误。我需要以某种方式删除整个场景并阻止它在后台运行。有没有办法做到这一点,所以我不会耗尽内存?
修改
这是我加载新场景的方法。
public void loadGameScene(final Engine mEngine, final SharedPreferences sp, final String map) {
setScene(loadingScene);
ResourcesManager.getInstance().unloadMenuTextures();
mEngine.registerUpdateHandler(new TimerHandler(0.3f,
new ITimerCallback() {
public void onTimePassed(final TimerHandler pTimerHandler) {
ResourcesManager.getInstance().unloadGameTextures();
mEngine.unregisterUpdateHandler(pTimerHandler);
ResourcesManager.getInstance().loadGameResources();
GameScene gameScene = new GameScene();
gameScene.setSp(sp);
gameScene.loadLevel(map);
gameScene.loadMap(map);
setScene(gameScene);
}
}));
}
我放入了
行ResourcesManager.getInstance().unloadGameTextures()
但问题仍然存在。
答案 0 :(得分:1)
在重新创建它之前,你必须卸载Pre-Level的所有资源,比如Texture Atlas,sprite。如果你使用的是Physics,那么你必须卸载你为sprite创建的物体。所有对象都会被清除掉你的记忆力很高。
答案 1 :(得分:1)
希望你;在你的项目中不要太远,因为答案我比你建立时更难以追溯。但这里是:无论何时创建对象,都应该有办法销毁该对象。然后确保在停止使用它们以释放内存时销毁所有对象。
根据你的描述,我敢打赌你正在做的是一遍又一遍地创造相同的纹理,从而吃掉你恐慌的纹理记忆。试试这个: 创建一个单独的类来创建和管理纹理。当您需要场景的纹理时,请询问该类以供参考。如果纹理不存在,它将创建它。但是,如果您已经创建了该纹理,那么它只会将您对第一次创建场景时创建的纹理的引用传回。
如果您需要查看一个有效的示例,请查看“AndEngine for Android Game Development Cookbook”一书中的代码示例。 http://www.packtpub.com/support/10411
在“ResourceManager”类的章节示例中搜索。
对于任何想要学习Andengine GLES2的人来说,它都是一个很好的参考。
答案 2 :(得分:1)
如果您在致电unload()
时正在使用的地图册上正确拨打ResourcesManager.getInstance().unloadGameTextures()
,则不应出现内存不足错误。
我不知道您的ResourceManager的行为方式,但每次更改场景时都不需要重新编制所有地图集(并且通过重新创建我的意思是调用new BitmapAtlas()
或某些变体)。
您的ResourceManager应该在游戏开始时创建所有需要的对象(包括地图集)。然后,当您需要某个场景的区域时,可以在具有这些区域的地图集上调用atlas.load()
,在其他不需要的地图集上调用atlas.unload()
。