Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Удаление addChild добавленных циклом (http://www.flasher.ru/forum/showthread.php?t=210824)

Фомич 10.05.2015 14:34

Удаление addChild добавленных циклом
 
Привет всем!
Задумался об оптимизации и удалении добавленных спрайтов и прочего на сцену.
добавлял так:
Код AS3:

for(var i:int=0; i<cointChild; i++)
{
var ob:Sprite=new Sprite();
 
addChild(ob);
 
 
}

Это все внутри другого спрайта, который удаляю removeChild, но стоит ли для очищения памяти сначала удалять все объекты внутри него?

undefined 10.05.2015 14:57

Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
Код AS3:

mySprite.addEventListener(event,myListener,false,0,true);

будет работать в 99% случаев и можно особо не парится вопросами типа 'а не забыл ли я отписаться от рассылки?'

Фомич 10.05.2015 15:22

Цитата:

Сообщение от undefined (Сообщение 1182226)
Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
Код AS3:

mySprite.addEventListener(event,myListener,false,0,true);

будет работать в 99% случаев и можно особо не парится вопросами типа 'а не забыл ли я отписаться от рассылки?'

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

caseyryan 10.05.2015 16:58

Цитата:

Вообще лучше сразу приучать себя к такой записи:
Зачем? Это плохая практика. Сыграла она один раз со мной очень злую шутку в большом игровом проекте. Недели 3 не мог выяснить почему объект на мышь не реагирует, кучу нервов потратил). Потом как-то случайно (уже не помню как именно) выяснил, что дело именно в подписке со слабым слушателем. Лучше всегда отписывать вручную, а про слабые ссылки забыть как про страшный сон.
Цитата:

Интересовал только вопрос - если я создаю спрайты, внутри которых куча других спрайтов(на события подписки нет), достаточно ли будет удалить основные.
Да, этого будет вполне достаточно. Но если в них есть растровые картинки, то у их BitmapData объектов
стоит еще и dispose() вызвать (но это по обстоятельствам)

undefined 10.05.2015 17:13

Цитата:

Зачем? Это плохая практика
вот поэтому и 99%.Тут опять же на вкус и цвет.Как по мне, так нерабочий хэндлер всегда будет в глаза бросаться, а вот мемори лик может скрываться вплоть до продакшена.Каждый сам выбирает что ему проще не спускать глаз с профайлера, либо четко держать в голове событийную модель.
upd:Вообще странно что у тебя слушатель не вызывался.Может стояла подписка на capture phase?Я то агитирую использовать слабые ссылки, а не useCapture=true

caseyryan 10.05.2015 18:10

Цитата:

Вообще странно что у тебя слушатель не вызывался.Может стояла подписка на capture phase?Я то агитирую использовать слабые ссылки, а не useCapture=true
Не не, именно слабая ссылка. Там слушатель с объекта как-то удалялся, при том, что сам объект оставался цел и невредим.
Поэтому я для себя раз и навсегда решил, что делать надо так: добавил слушатель, и сразу же в деструкторе добавил отписку от него, чтобы потом не забыть

undefined 10.05.2015 18:25

Ну странно ожидать вызова хэндлера если слушатель удален.Ладно не будем разводить холиворов,останемся при своих, думаю ТС понял какие могут быть подводные камни в каждом случае.
upd:А там слушатель удалялся и из-за этого не вызывался хэндлер.Хотя все равно не понятно как изменение типа ссылки могло повлиять на удаление слушателя

Фомич 10.05.2015 19:23

Отлично, буду иметь ввиду. Там действительно есть внутри BitmapData, но так как она может быть вызвана снова - из оперативной памяти удалять не стоит (если правильно понял про dispose() )

caseyryan 10.05.2015 19:49

Ну, если используется, то действительно не нужно уничтожать
Цитата:

upd:А там слушатель удалялся и из-за этого не вызывался хэндлер.Хотя все равно не понятно как изменение типа ссылки могло повлиять на удаление слушателя
Мне тоже не понятно. Но факт остается фактом. Все заработало, когда убрал эту слабую ссылку и сделал сильную)


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

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