Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.05.2015, 14:34
Фомич вне форума Посмотреть профиль Отправить личное сообщение для Фомич Найти все сообщения от Фомич
  № 1  
Ответить с цитированием
Фомич

Регистрация: Feb 2015
Сообщений: 63
По умолчанию Удаление addChild добавленных циклом

Привет всем!
Задумался об оптимизации и удалении добавленных спрайтов и прочего на сцену.
добавлял так:
Код AS3:
for(var i:int=0; i<cointChild; i++)
{
var ob:Sprite=new Sprite();
 
addChild(ob);
 
 
}
Это все внутри другого спрайта, который удаляю removeChild, но стоит ли для очищения памяти сначала удалять все объекты внутри него?

Старый 10.05.2015, 14:57
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,282
Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
Код AS3:
mySprite.addEventListener(event,myListener,false,0,true);
будет работать в 99% случаев и можно особо не парится вопросами типа 'а не забыл ли я отписаться от рассылки?'

Старый 10.05.2015, 15:22
Фомич вне форума Посмотреть профиль Отправить личное сообщение для Фомич Найти все сообщения от Фомич
  № 3  
Ответить с цитированием
Фомич

Регистрация: Feb 2015
Сообщений: 63
Цитата:
Сообщение от undefined Посмотреть сообщение
Удалять специально всех детей нет необходимости сборщик мусора сам все почистит,независимо от того кто внутри кого находится.Единственное что стоит делать - отписывать детей от рассылки всех событий.
Вообще лучше сразу приучать себя к такой записи:
Код AS3:
mySprite.addEventListener(event,myListener,false,0,true);
будет работать в 99% случаев и можно особо не парится вопросами типа 'а не забыл ли я отписаться от рассылки?'
Последний параметр - это включение слабой ссылки, по-видимому. Спасибо за совет. С отписыванием пока справляюсь. Интересовал только вопрос - если я создаю спрайты, внутри которых куча других спрайтов(на события подписки нет), достаточно ли будет удалить основные.

Старый 10.05.2015, 16:58
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Вообще лучше сразу приучать себя к такой записи:
Зачем? Это плохая практика. Сыграла она один раз со мной очень злую шутку в большом игровом проекте. Недели 3 не мог выяснить почему объект на мышь не реагирует, кучу нервов потратил). Потом как-то случайно (уже не помню как именно) выяснил, что дело именно в подписке со слабым слушателем. Лучше всегда отписывать вручную, а про слабые ссылки забыть как про страшный сон.
Цитата:
Интересовал только вопрос - если я создаю спрайты, внутри которых куча других спрайтов(на события подписки нет), достаточно ли будет удалить основные.
Да, этого будет вполне достаточно. Но если в них есть растровые картинки, то у их BitmapData объектов
стоит еще и dispose() вызвать (но это по обстоятельствам)

Старый 10.05.2015, 17:13
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 5  
Ответить с цитированием
undefined

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


Последний раз редактировалось undefined; 10.05.2015 в 17:30.
Старый 10.05.2015, 18:10
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

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

Старый 10.05.2015, 18:25
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 7  
Ответить с цитированием
undefined

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


Последний раз редактировалось undefined; 10.05.2015 в 18:50.
Старый 10.05.2015, 19:23
Фомич вне форума Посмотреть профиль Отправить личное сообщение для Фомич Найти все сообщения от Фомич
  № 8  
Ответить с цитированием
Фомич

Регистрация: Feb 2015
Сообщений: 63
Отлично, буду иметь ввиду. Там действительно есть внутри BitmapData, но так как она может быть вызвана снова - из оперативной памяти удалять не стоит (если правильно понял про dispose() )

Старый 10.05.2015, 19:49
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Ну, если используется, то действительно не нужно уничтожать
Цитата:
upd:А там слушатель удалялся и из-за этого не вызывался хэндлер.Хотя все равно не понятно как изменение типа ссылки могло повлиять на удаление слушателя
Мне тоже не понятно. Но факт остается фактом. Все заработало, когда убрал эту слабую ссылку и сделал сильную)

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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