Полностью удалить сцену в AndEngine

Чтобы переключаться между уровнями в моей игре, я воссоздаю свою GameScene, но когда я переключаю уровни примерно 3 или 4 раза, я получаю ошибку errno 12 out of memory. Мне нужно как-то удалить всю сцену и остановить ее работу в фоновом режиме. Есть ли способ сделать это, чтобы у меня не закончилась память?

ИЗМЕНИТЬ:

Это мой метод, в котором я загружаю новую сцену.

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

но проблема сохраняется.


person user2005938    schedule 13.10.2013    source источник
comment
Не могли бы вы показать нам код для ResourcesManager.getInstance().unloadGameTextures()?   -  person Orgmir    schedule 18.10.2013
comment
Также какого размера изображения и атлас вы используете?   -  person Orgmir    schedule 18.10.2013


Ответы (3)


Если вы правильно вызываете unload() в атласе, который вы используете при вызове ResourcesManager.getInstance().unloadGameTextures(), вы не должны получить ошибку нехватки памяти.

Я не знаю, как ведет себя ваш ResourceManager, но вам не нужно воссоздавать весь атлас каждый раз, когда вы меняете сцену (и под воссозданием я имею в виду вызов new BitmapAtlas() или какой-то вариант).

Ваш ResourceManager должен создать все необходимые объекты в начале игры (включая атлас). Затем, когда вам нужны регионы для определенной сцены, вы вызываете atlas.load() для атласа, в котором есть эти регионы, и atlas.unload() для другого атласа, который вам не нужен.

person Orgmir    schedule 17.10.2013
comment
Вы правы, проблема была в том, что я создал отдельный атлас текстур для фонов, который забыл выгрузить. Дух. Спасибо за ваш вклад. - person user2005938; 20.10.2013

Прежде чем воссоздать его, вы должны выгрузить все ресурсы предварительного уровня, такие как Атлас текстур, спрайты. Если вы используете физику, вам нужно выгрузить тела, которые вы создали для спрайтов. Так что все объекты будут очищены, что сделает вашу память более эффективной. .

person Rama    schedule 14.10.2013

Надеюсь, вы не слишком продвинулись в своем проекте, потому что ответ мне труднее добавить задним числом, чем по мере создания. Но вот оно: всякий раз, когда вы создаете объект, у вас должен быть способ уничтожить этот объект. Затем убедитесь, что вы уничтожили все объекты, когда перестанете их использовать для освобождения памяти.

Судя по тому, что вы описываете, могу поспорить, что вы создаете одни и те же текстуры снова и снова, тем самым съедая свою память о страшных текстурах. Вместо этого попробуйте следующее: создайте отдельный класс для создания текстур и управления ими. Когда вам нужна текстура для сцены, попросите у этого класса ссылку. Если текстуры не существует, он ее создаст. Но если вы уже создали эту текстуру раньше, она просто передаст ссылку на текстуру, которую вы создали при первом создании сцены.

Если вам нужен работающий пример, ознакомьтесь с примерами кода из книги AndEngine for Android Game Development Cookbook http://www.packtpub.com/support/10411

Найдите в примерах глав класс ResourceManager.

Это хороший справочник для тех, кто пытается изучить Andengine GLES2.

person Plastic Sturgeon    schedule 14.10.2013