完全删除AndEngine中的场景

时间:2013-10-13 15:39:03

标签: java android andengine out-of-memory scene

要在我的游戏中切换级别,我会重新创建我的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()

但问题仍然存在。

3 个答案:

答案 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()