0

为了在我的游戏中切换关卡,我重新创建了我的 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()

但问题仍然存在。

4

3 回答 3

1

如果您在调用时正确调用unload()了正在使用的图集,则ResourcesManager.getInstance().unloadGameTextures()不应出现内存不足错误。

我不知道您的 ResourceManager 的行为如何,但您不需要在每次更改场景时重新创建所有图集(通过重新创建我的意思是调用new BitmapAtlas()或一些变体)。

您的 ResourceManager 应该在游戏开始时创建所有需要的对象(这包括地图集)。然后,当您需要某个场景的区域时,您可以调用atlas.load()具有这些区域的atlas.unload()图集以及您不需要的其他图集。

于 2013-10-17T20:35:07.797 回答
1

希望你在你的项目中并没有走得太远,因为答案比你构建时更难追溯添加。但这就是:每当你创建一个对象时,你应该有办法销毁那个对象。然后确保在停止使用它们以释放内存时销毁所有对象。

根据您的描述,我敢打赌,您正在做的是一遍又一遍地创建相同的纹理,从而耗尽了您可怕的纹理记忆。试试这个:创建一个单独的类来创建和管理你的纹理。当您需要场景的纹理时,请向该类索取参考。如果纹理不存在,它将创建它。但是,如果您在创建该纹理之前已经创建了该纹理,它只会将引用传回您在第一次创建场景时创建的纹理。

如果您需要查看一个工作示例,请查看“AndEngine for Android Game Development Cookbook”一书中的代码示例 http://www.packtpub.com/support/10411

在章节示例中搜索“ResourceManager”类。

对于任何试图学习 Andengine GLES2 的人来说,它都是一个很好的参考。

于 2013-10-14T20:26:35.457 回答
1

在重新创建它之前,您必须卸载 Pre-Level 的所有资源,如纹理图集、精灵。如果您使用的是物理,那么您必须卸载为精灵创建的实体。这样所有对象都将被清除,从而提高您的内存效率.

于 2013-10-14T05:01:19.000 回答