Просмотр полной версии : Удаление addChild добавленных циклом
Привет всем!
Задумался об оптимизации и удалении добавленных спрайтов и прочего на сцену.
добавлял так:
for(var i:int=0; i<cointChild; i++)
{
var ob:Sprite=new Sprite();
addChild(ob);
}
Это все внутри другого спрайта, который удаляю removeChild, но стоит ли для очищения памяти сначала удалять все объекты внутри него?
undefined
10.05.2015, 14:57
Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
mySprite.addEventListener(event,myListener,false,0,true);
будет работать в 99% случаев и можно особо не парится вопросами типа 'а не забыл ли я отписаться от рассылки?'
Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
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:А там слушатель удалялся и из-за этого не вызывался хэндлер.Хотя все равно не понятно как изменение типа ссылки могло повлиять на удаление слушателя
Отлично, буду иметь ввиду. Там действительно есть внутри BitmapData, но так как она может быть вызвана снова - из оперативной памяти удалять не стоит (если правильно понял про dispose() )
caseyryan
10.05.2015, 19:49
Ну, если используется, то действительно не нужно уничтожать
upd:А там слушатель удалялся и из-за этого не вызывался хэндлер.Хотя все равно не понятно как изменение типа ссылки могло повлиять на удаление слушателя
Мне тоже не понятно. Но факт остается фактом. Все заработало, когда убрал эту слабую ссылку и сделал сильную)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.