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

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

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

Регистрация: Oct 2013
Сообщений: 126
По умолчанию ADDED_TO/REMOVED_FROM_STAGE - панацея для чистки иерархии?

Пришла в голову мысль добавить всем классам, имеющим детей, проверку added_to_stage с методом init() и removed_from_stage с методом cleanup() соответственно. Весь код из конструктора перенести в init, а в cleanup удалить всех детей и обнулить все ссылки. Больше ради очищения мусора при переходе между комнатами, чем для проверки добавления на сцену.
В принципе, у меня уже есть такие проверки в самых старших родителях (детях Main) - классах соответствующих уровней/комнат/экранов (типа Level, Menu и т.д.), соответственно, при переходе из "комнаты" в "комнату" все внуки этих самых "комнат" удаляются автоматически (остаётся только разобраться со слушателями, которых я, на всякий случай, стараюсь всегда удалять отдельно).
Вопрос в следующем: имеет ли смысл для любого объекта, имеющего детей, ставить проверки добавления на и удаления со сцены, чтобы быть уверенным, что чистится вся иерархия?
(Если смысла в этом нет, то подскажите, в каких случаях, кроме наличия ссылки на stage, нужны такие проверки?)

Старый 27.12.2013, 17:37
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Имеет, но в конструкторе, а не в инит и прочее. Это обезопасит код от падений только и всего, что в нашем деле довольно важно.
__________________
Марк Tween

Старый 27.12.2013, 18:56
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 3  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от in4core Посмотреть сообщение
Имеет, но в конструкторе, а не в инит
Не уверен, что понял вас правильно.
Вот как у меня сейчас:
Main.as:
Код AS3:
public class Main extends Sprite {	
 
		// CONSTRUCTOR
		public function Main():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		// INIT
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			// загружаем все элементы, создаём комнаты и т.д.
 
		};
 
 
		// ПЕРЕХОД из комнаты в комнату
		private function transition(e:MyEvent):void {
			_Rooms[_curIn].cleanup(); // чистим комнату, из которой ушли
			removeChildren(); // уничтожаем всех детей
 
			// создаём новую комнату
 
		};
 
	};
А в каждой комнате так:
Код AS3:
// CONSTRUCTOR
		public function Plan() {
			// создание и удаление всего при добавлении и удалении со сцены
			addEventListener(Event.ADDED_TO_STAGE, init);
		};
 
//INIT
private function init(e:Event): void {
// тут всё создаём и т.д.
}
 
//CLEANUP (вызывается родителем)
		public function cleanup(): void{
			// удаляем всех детей
			removeChildren();
			// убираем слушателей (своих и детей, если были объявлены здесь)
			// обнуляем ссылки на объекты			
 
		};
Значит, всё-таки, имеет смысл сделать подобную систему везде?.. Только тут у меня cleanup вызывается родителем. Лучше, наверное, будет, делать чистку через removed_from_stage, а родитель пусть только удаляет?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Если нужно, чтобы все удалялось обязательно, то можно и сделать. Если нужно заново использовать, то ни в коем случае. В общем, могу сказать так, все зависит от задачи, которую нужно выполнить.
Вот такой подход (говорю из практики), может привести к таким глюкам, что голова взорвется их потом лечить. У меня в одной игре был такой подход, и как-то раз получилось так, что объект удалялся из дисплей листа, а ссылка на него сохранялась. Потом происходило обращение к одному из его свойств, по событию с сервера, а так как свойство уже было обнулено внутри, происходило падение null refference. Честно скажу, перематерил всех и вся, пока искал в чем же проблема, и потратил на это несколько недель. Все усложнялось еще тем, что глюк происходил не всегда.
В общем, для себя тогда решил, что такой подход больше не буду использовать никогда.
Сейчас я делаю везде методы dispose(); в которых все подчищается, и происходит это когда нужно, а не при удалении объекта из дисплей листа

Старый 27.12.2013, 23:14
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 5  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Если нужно заново использовать, то ни в коем случае.
Цитата:
Сообщение от caseyryan Посмотреть сообщение
У меня в одной игре был такой подход, и как-то раз получилось так, что объект удалялся из дисплей листа, а ссылка на него сохранялась. Потом происходило обращение к одному из его свойств, по событию с сервера, а так как свойство уже было обнулено внутри, происходило падение null refference.
Понимаю Вас, тоже с этим сталкивался. И всё же пока буду действовать так - единообразие дисциплинирует и делает структуру собственного проекта понятнее для себя самого. Единственное исключение, как Вы верно заметили - повторно используемые объекты - в таких случаях я сделал чистку немного по-другому.
Спасибо всем за советы.

Старый 28.12.2013, 00:35
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 6  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от caseyryan
Если нужно заново использовать, то ни в коем случае.
Если не слушать Инфокора и сделать по человечески инит и дестрой - то это очень правильная практика.
Но чтобы можно было реиспользовать придется грамотно писать иниты с дестроями. Чтоб в любой момент можно было вместо new Some() взять из буфера и сделать some1.init(); Ну и соответственно чтоб дестрой дестроил по-максимуму, но ровно настолько, чтобы потом оставалась возможность реинита.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 28.12.2013, 01:16
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 7  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Автоматическое неявное удаление закономерно и неизбежно приведет к ошибкам.

Старый 28.12.2013, 08:24
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Вообще Дикобраз правильную тему толкает: пул объектов спасает. Вместо
Код AS3:
new SomeClass()
в конструкторе которого будет инициализация переменных делать
Код AS3:
SomeClass.getInstance()
который вернет экземпляр (возможно, новый, возможно, старый, но уже "ненужный").
dispose() делает только то, что возвращает объект в этот пул. А подчищается всё в пуле там, где это нужно.

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

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

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


 


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


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