繁体   English   中英

完全删除AndEngine中的场景

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM