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

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

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

Регистрация: Feb 2009
Сообщений: 141
По умолчанию Лики памяти (общее)

Хочу еще раз затронуть тему ликов памяти при выполнении флеш приложения.
Я думаю, что не все программисты проверяют свои разработки на подобные баги или часто используют профайлер? Особенно остро этот вопрос стоит, когда юзается более менее большое приложение и достаточно долго без его перезагрузки. Я довольно часто ощущаю подобные неудобства, работая с различными приложениями, буквально с каждой минуты его работы, заметна разница в падении производительности работы приложения.

Все эти неудобства в большинстве случаев вызваны большим количеством динамических событий. Большое число временных объектов подписываются на события, которые ожидают прослушивания, но не дождавшись их, далеко наверху удаляется объект, который содержит в себе все это и не может удалиться из памяти, так как по прежнему ожидает n-ое кол-во прослушиваний. Так как же избежать такой ситуации, когда мы удаляем объект на порядок выше в структуре и не можем (точнее можем, но окольными путями) отписать все его потроха от событий?

В каждом классе, где используются динамические события, да и вобще события, от которых нужно отписаться при удалении этого экземпляра я использую следующий простой способ.

Код AS3:
public class Test extends Sprite
	{
		public function Test()
		{
			super();
 
			this.addEventListener(Event.REMOVED_FROM_STAGE, __thisRemove);
		}
 
		private function __thisRemove(e:Event):void
		{
			this.removeEventListener(Event.REMOVED_FROM_STAGE, __thisRemove);
 
			//Отписываемся от динамических событий
		}
	}
Возможно, я никому ничего нового не рассказал. Но кто знает, может кому-то это будет полезным.
Или даже, возможно, я использую велосипед, кто как выходит из положения, можете поделиться опытом?

Вопрос я этот поднял потому, что программируя несколько лет и разрабатывая приложения, где лики памяти были ощутимы, эти две строчки кода в тот момент для меня не были очевидными.

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

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Утечки памяти и их устранение

Нужно писать деструкторы и использовать их по назначению. Ваш метод годится (да и то крайне редко) только для экранных объектов, и я бы сказал, что его польза сомнительна.
__________________
Блог, Twitter
Брюзга.

Старый 27.08.2011, 14:53
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 3  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
Вопрос такой а если я перезаписываю какую либо переменную новым экземпляром удаляется ли предыдущий объект из памяти?
Код AS3:
var link1:Class = new Class1();
link1 = new Class2();
Удаляется ли то что выделялось под Class1?

Старый 27.08.2011, 14:59
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Когда придет GC, удалится. Однако все обработчики события так и останутся висеть в памяти, их нужно вручную чистить.
__________________
тут я

Старый 27.08.2011, 15:06
Mideon вне форума Посмотреть профиль Отправить личное сообщение для Mideon Найти все сообщения от Mideon
  № 5  
Ответить с цитированием
Mideon

Регистрация: Aug 2007
Сообщений: 54
Еще такой вопрос, если внутри контейнера несколько разных объектов, их тоже надо удалять из списка отображения и обнулять перед тем как обнулить этот контейнер, или достаточно обнулить сам контейнер?
Насчет обработчиков понятно. Если они есть внутри контейнера то отписываемся.

Старый 27.08.2011, 15:08
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 6  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Лучше обнулить. Но, насколько мне известно, GC неплохо обрабатывает кольцевые ссылки. А вообще, профайлер в руки и вперед пробовать.
__________________
тут я

Старый 27.08.2011, 15:23
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
@Vreden

Безобразие. У вас ошибка в слове "памяти". Правильно писать "лики мемори".

Есть хороший русскоязычный термин "утечка".
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 30.08.2011 в 21:31.
Старый 27.08.2011, 15:47
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 8  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Цитата:
Сообщение от dimarik Посмотреть сообщение
@Vreden

Безобразие. У вас ошибка в слове "памяти". Правильно писать "лики мемори".

Есть хороший русскоязычный термин "утечка". Если хотите сойти за умного, повторяйте его как мантру.
Звучит прям как "лики смерти", Боже упаси. Мемори ликс тогда уже, а лучше, действительно - "утечка пямяти".
Я стараюсь отписаться всегда маниакально от всего, делая деструкторы.

Старый 27.08.2011, 22:36
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Подписки на самого себя можно не убирать.

Старый 28.08.2011, 00:08
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 10  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Когда проектирую объект стараюсь тщательно продумывать его инициализацию и уничтожение, а от событий стараюсь отписываться сразу как только появляется возможность. GC вызываю silin-ским скриптиком. А по другому и не возможно, ИМХО, контролировать ресурсы.

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

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

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


 


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


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