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

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

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

Регистрация: Jan 2009
Сообщений: 13
По умолчанию удаление movieclip

Для создания эффекта клубов дыма я добавляю мувиклипы, которые сами себя со временем уничтожают (по крайней мере, так задумывалось):
Код AS3:
	public class smoke extends MovieClip
	{
		var disappeartimer:Timer = new Timer(90);
		public function smoke() 
		{
			disappeartimer.addEventListener(TimerEvent.TIMER, removesmoke);
			disappeartimer.start();
		}
 
		private function removesmoke(event:TimerEvent)
		{
			disappeartimer.removeEventListener(TimerEvent.TIMER, removesmoke);
			MovieClip(parent).removeChild(this);
			delete this;
		}
 
	}
На деле объекты в каком-то виде явно продолжают существовать, т.к. через некоторое время после запуска игры становятся заметны притормаживания, и со временем ситуация ухудшается. Как правильно удалять экземпляры smoke?

Старый 31.03.2009, 19:21
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 2  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Попробуйте:
Код AS3:
disappeartimer.stop();
stop();
И можно так:
Код AS3:
parent.removeChild(this);
__________________
Griver

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

Регистрация: Jun 2008
Сообщений: 51
Остановите таймер и переменной disappeartimer присвойте значение null. "delete this", насколько знаю, несет практически нулевую смысловую нагрузку.

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

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Теоретически сборщик мусора должен удалять ваши мувики, если вы не сохраняете на них нигде указатели... но со временем . Строка delete this избыточна, если экземпляры smoke являются локальными переменными некой функции.
Хотя лучше организовать систему, которая будет создавать, контролировать и удалять мувики дыма с родительского клипа.

Старый 31.03.2009, 19:35
Dimonte вне форума Посмотреть профиль Отправить личное сообщение для Dimonte Найти все сообщения от Dimonte
  № 5  
Ответить с цитированием
Dimonte

Регистрация: Jun 2008
Сообщений: 51
litebox, работающий таймер не позволит коллектору уничтожить объект. И чем лучше создавать систему, которая будет выполнять все те функции, которые объект и сам прекрасно выполняет? Единственное, с чем вижу потенциальную проблему - самоудаление из Display List'а, которое предполагает, что объект добавлен в оный список. Добавление пары listener'ов на ADDED_TO_STAGE и REMOVED_FROM_STAGE должно решить и эту проблему.

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

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Таймер остановить желательно, но не обязательно - главное, что его больше ничего не связывает "с внешним миром".
Дело в том, что если плодить такие мувики "без контроля", тормозить будет в любом случае, т.к. сборщик мусора не будет удалять их на лету, а только когда:
а) пройдет определенный интервал времени;
б) закончится область памяти, первоначально захваченная плеером.
Дым - это по сути система частиц, которой нужно управлять. Таким образом, можно определить, что, например, целевой компьютер выдерживает 30 облачков дыма, и выталкивать из массива старые элементы, замещая новыми - таким образом в кадре никогда не окажется безмерного кол-ва клипов

Старый 31.03.2009, 19:59
Dimonte вне форума Посмотреть профиль Отправить личное сообщение для Dimonte Найти все сообщения от Dimonte
  № 7  
Ответить с цитированием
Dimonte

Регистрация: Jun 2008
Сообщений: 51
Ну, если уж на то пошло, частицы лучше вообще не добавлять в дисплей лист, а отрисовывать методом copyPixels из заранее подготовленной спрайтмапы. Это точно будет быстрее.
Далее, выталкивание объекта из массива не гарантирует его немедленного удаления. Коллектор соберет его только тогда, когда произойдут вами же описанные события.

Старый 31.03.2009, 20:54
Tiberian вне форума Посмотреть профиль Отправить личное сообщение для Tiberian Найти все сообщения от Tiberian
  № 8  
Ответить с цитированием
Tiberian

Регистрация: Jan 2009
Сообщений: 13
Всем спасибо, остановка таймера действительно помогла =)

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

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

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


 


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


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