Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как грамотно убить мувик? (http://www.flasher.ru/forum/showthread.php?t=143997)

nldr 31.08.2010 21:51

Тогда еще один вопросик.
Вот код:
Код AS3:

//Удаляем уровень игры (в который напихали всякой фигни) из списка отображения
removeChild(level);
//Приравниваем переменную к null
level = null;
 
//Создаем новый уровень                               
level = new CLevel(++n);
//Добавляем в список отображения
addChildAt(level, 0);

Кроме уровня (level) больше ничего нет, прелодеры и прочее на время теста убрал. Все что добавляется, добавляется непосредственно в level. Листенеров и таймеров, внешних нет.

Флешка изначально отжирает 17мегов памяти
Так вот, если сделать это (пересоздать уровень) несколько раз, то флешка отжирает до 100мегов, затем потребление памяти падает. Причем каждый раз падает по разному, но еще ни разу не упало обратно до 17 мегов. Это нормально? (Тестирую в Stand-alone debug плеере).

Psycho Tiger 31.08.2010 21:53

Смотреть нужно в профайлере, а не через диспетчер задач или всякие там Sysem.totalMemory.

Если не знаете что такое профайлер - ищите в гугле. Заодно поищите про Garbage Collector.

artcraft 01.09.2010 04:56

Цитата:

Сообщение от nldr (Сообщение 932756)
Т Листенеров и таймеров, внешних нет.

внутренние таймеры надо убить тоже

Psycho Tiger 01.09.2010 18:50

Таймера будут выполнятся, ну и что с ними? =)

Например в примере у silin`а при запуске GC (наверняка все видели) работала подпика на ENTER_FRAME. И ведь убивалась =) С таймерами наверняка та же фигня.

Тут речь уже скорее об эмуляции что всё отошло в мир иной, а вопрос был о достаточности отхода.

artcraft 01.09.2010 19:15

Цитата:

Сообщение от Psycho Tiger (Сообщение 932918)
Таймера будут выполнятся, ну и что с ними? =)

таймер продолжает действовать даже в удалённом объекте http://www.bit-101.com/blog/?p=1169
зачем тратить ресурсы на вычисления внутри объекта который должен быть удалён?

Psycho Tiger 01.09.2010 19:24

Цитата:

таймер продолжает действовать даже в удалённом объекте http://www.bit-101.com/blog/?p=1169
Ого, спасибо, буду знать.
Цитата:

зачем тратить ресурсы на вычисления внутри объекта который должен быть удалён?
Я ведь не говорил, что это неправильно. Я говорил что это необязательно, ну и выходит что ошибался - хотя статью надо будет на досуге проверить =)

mechman 12.11.2010 08:53

А как удалить объект, если на него имеется только ссылка?
Код AS3:

 for (var i:int = numberOfChilds-1; i >= 0; i--) { 
        curObject = (getChildAt(0) as Sprite).getChildAt(i);
        // здесь делаем с этим объектом все, что нужно
        // а здесь удаляем его полностью. но как?
}

curObject = null; разве сработает?

MrPoma 12.11.2010 09:23

Цитата:

Сообщение от mechman (Сообщение 949269)
А как удалить объект, если на него имеется только ссылка?
Код AS3:

 for (var i:int = numberOfChilds-1; i >= 0; i--) { 
        curObject = (getChildAt(0) as Sprite).getChildAt(i);
        // здесь делаем с этим объектом все, что нужно
        // а здесь удаляем его полностью. но как?
}

curObject = null; разве сработает?

Если curObject - переменная экемпляра, присвойте ей null, если локальная переменная, ничего не делайте. Еще нужно удалить его из списка отображения. Вам же написали.

mechman 12.11.2010 10:32

Цитата:

Еще нужно удалить его из списка отображения. Вам же написали.
Это понятно.
А вот по удалению самого объекта...

Уточню.
Есть мувиклип А. В нем Б. А уже в нём 20 мувиклипов.
В мувиклипе А:
Код AS3:

private var curObject:Object;
// цикл, в котором переменной curObject присваивается ссылка на очередной клип.
for (var i:int = 1; i < 20; i++) {
  curObject = мувикБ.getChildAt(i);
  trace(curObject.x); // набор действий над клипом
  curObject = null; // удаление, которое не работает,
  //так как скорее всего null присваивается переменной curObject,
  //а не объекту, на который ссылка
}


AlexDesinger 12.11.2010 11:29

Если требуется удалить очень сложный объект, в котором много чего напихано, лучше отдельно прописать метод 'destroy' или что то в этом духе, куда вам придется вручную прописать удаление всех листенеров, таймеров, интервалов, ссылок и пр. все, из-за чего мусорщик может считать объект активным. Достаточно хлопотно, но еще лучше строить объект level таким образом, чтобы не приходилось его удалять, а можно было бы модифицировать при изменившихся обстоятельствах, а удалять в нем простые объекты, если нужно.


Часовой пояс GMT +4, время: 18:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.