[英]Completely remove scene in AndEngine
要在游戏中切换关卡,我需要重新创建GameScene,但是当我切换关卡约3到4次时,会出现errno 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()
但问题仍然存在。
在重新创建之前,您必须卸载Pre-Level的所有资源,例如Texture Atlas,Sprites。如果使用Physics,则必须卸载为Sprites创建的实体,以便清除所有对象,从而提高内存效率。
希望您不会在项目中走得太远,因为与构建时相比,我很难追溯地添加答案。 但这就是:无论何时创建对象,都应该有一种销毁该对象的方法。 然后,请确保在停止使用所有对象以释放内存时销毁所有对象。
根据您的描述,我敢打赌,您正在做的是一次又一次地创建相同的纹理,从而耗尽了您的恐惧纹理记忆。 请尝试以下操作:创建一个单独的类来创建和管理纹理。 当您需要一个场景的纹理时,请向该类提供参考。 如果纹理不存在,它将创建它。 但是,如果您已经创建了该纹理,那么它将在第一次创建场景时将参考传递回您创建的纹理。
如果您需要查看工作示例,请查看“ AndEngine for Android Game Development Cookbook”一书中的代码示例,网址为http://www.packtpub.com/support/10411
在章节示例中搜索“ ResourceManager”类。
对于任何想学习Andengine GLES2的人来说,它都是一个很好的参考。
如果在调用ResourcesManager.getInstance().unloadGameTextures()
时正确调用了正在使用的图集上的unload()
,则不会出现内存不足错误。
我不知道您的ResourceManager的行为,但是您不必在每次更改场景时都重新创建所有地图集(通过重新创建,我的意思是调用new BitmapAtlas()
或某些变体)。
您的ResourceManager应该在游戏开始时创建所有需要的对象(包括地图集)。 然后,当你需要的区域有一定的场景,你叫atlas.load()
在具有这些地区和阿特拉斯atlas.unload()
上,你不需要其他地图集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.