Форум 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)

kayn 31.08.2010 05:29

Как грамотно убить мувик?
 
Как убить мувик, чтобы он исчез бесследно и не засорял память? При этом переменную, ссылающуюся на него, не удалять, а просто приравнять null.

Psycho Tiger 31.08.2010 09:41

Удалить его из дисплай листа и заnullить на него все ссылки.

Приравнивание ссылки к null равнозначно удалению этой самой ссылки, ровно как и приравнивание к какой-нибудь другой ссылки. Короче, если переменная перестал на него ссылаться по любой из причин - ссылка от этой переменной на него удалена.

kayn 31.08.2010 16:26

Да нефига, и диспетчер задач тому подтверждение, плеер грузит память как мула. И не ссылку надо удалить, а сам клип.

in4core 31.08.2010 16:28

Да что вы? Считаете что null объект может грузить память? вы ошибаетесь. Тигра прально написал

kayn 31.08.2010 16:33

Да я не против, но с каждым s=new mov(); память нагружается очередной сотней килобайт.

Dragosha 31.08.2010 16:35

и будет нагружаться до тех пор, пока GC не соизволит ее почистить.
все тут верно написали.

random13 31.08.2010 16:37

Цитата:

Сообщение от kayn (Сообщение 932661)
Да я не против, но с каждым s=new mov(); память нагружается очередной сотней килобайт.

значит вы так офигистически зачистили.. к тому же gc работает не постоянно, а только в определенные моменты время

artcraft 31.08.2010 16:37

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

nldr 31.08.2010 21:15

Вопрос в тему, а что если у мувика есть вложенные мувики? Их нужно каждый убивать или достаточно убить родительский мувик?

Psycho Tiger 31.08.2010 21:20

Достаточно убить родительский.

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 таким образом, чтобы не приходилось его удалять, а можно было бы модифицировать при изменившихся обстоятельствах, а удалять в нем простые объекты, если нужно.

mechman 12.11.2010 11:40

Цитата:

... а удалять в нем простые объекты, если нужно.
В том то и дело, что там 2 десятка простейших объектов, которые нужно поудалять в цикле.
Уважаемые профессионалы, помогите, пожалуйста. )

chabapok 12.11.2010 22:07

Может вам лучше не удалять, а возвращать в стек? А когда обьект нужен, то не создавать, а брать из стека, если там есть.


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

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