【问题标题】:Completely remove scene in AndEngine完全移除 AndEngine 中的场景
【发布时间】:2013-10-13 15:39:03
【问题描述】:

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

但问题仍然存在。

【问题讨论】:

  • 你能告诉我们ResourcesManager.getInstance().unloadGameTextures()的代码吗?
  • 还有你使用的图片和图集的尺寸是多少?

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


【解决方案1】:

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

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

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

【讨论】:

  • 你说得对,问题是我为背景创建了一个单独的纹理图集,我忘记卸载了。呃。感谢您的意见。
【解决方案2】:

在重新创建它之前,您必须卸载 Pre-Level 的所有资源,例如纹理图集、精灵。如果您使用的是物理,那么您必须卸载为精灵创建的实体。这样所有对象都会被清除,这使得你的记忆效率很高。

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多