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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.09.2006, 23:09
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 11  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
artcraft, спасибо... и очень хорошо бы с русским переводом, т.к. там важно буквально каждое слово.

Похоже GC срабатывает, когда происходит перераспределение памяти. Например, если к моему последнему тесту, благополучно проработавшему два часа так и не удалив мувик из памяти, добавить в руте такой код:
Код:
var ar:Array = new Array();
var tm:Timer = new Timer(1000);
tm.addEventListener("timer", timerHandler);
tm.start();

function timerHandler(event:TimerEvent):void {
	trace("timerHandler: " + getTimer());
	for (var i:uint=0; i<1000; i++) {
		ar.push( new Sprite() );
	}
}
Фактически просто начинаем активно "кушать" память. То реальное удаление мувика Test из памяти происходит примерно через три секунды (перестает срабатывать EnterFrame).
Значит useWeakReference из функции addEventListener работает корректно, и его можно использовать для событий типа click, mouse..., focus... Которые зависят от самого мувика.
Для событий срабатывающих самостоятельно, типа enterFrame, activate... придется прописывать отдельную функцию на удаление всех созданных Listeners и запускать ее вручную или по Event.REMOVED, смотря по ситуации.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 11.09.2006, 23:15
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 12  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
есть полезная фигня: System.totalMemory
The amount of memory (in bytes) currently in use by Flash Player.
__________________
Хороший отдых - половина работы.

Старый 11.09.2006, 23:24
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 13  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Есть, только по ней смотреть не получается. Если флеш отхавал кусок памяти, то даже после удаления всего хлама он не торопится память освобождать, и получается, что System.totalMemory показывает не сколько памяти требуется в конкретно данный момент, а сколько всего пришлось выделить в пике.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 12.09.2006, 00:09
FlexBuilder вне форума Посмотреть профиль Отправить личное сообщение для FlexBuilder Найти все сообщения от FlexBuilder
  № 14  
Ответить с цитированием
FlexBuilder

Регистрация: Aug 2006
Сообщений: 70
по просьбе Merlin-а перевод сообщения artcraft (мерси ему за цитату)

http://www.gskinner.com/blog/archive...source_ma.html

Очень важная вещь, которую нужно понимать при работе со сборщиком мусора в 9-м флешплеере, заключается в том, что эта операция является отложенной. Ваши объекты не будут уничтожены немедленно после того, как все активные ссылки будут удалены, напротив они будут уничтожены лишь через некоторое неопределенное (с точки зрения разработчика) время. Сборщик мусора использует набор эвристических алгоритмов, которые контролируют распределение ОЗУ и размер стека (а также другие факторы) для принятия решения о чистке. Как разработчик вы должны смириться с фактом, что вам не остается никакой возможности для того, чтобы узнать когда (и даже убедиться что) ваши неактивные объекты будут уничтожены. Вам также необходимо знать, что неактивные объекты продолжают выполняться неограничено, (до тех пор пока сборщик мусора не удалит их), а значит код будет продолжать выполняться (например enterFrames), звуки - играть, загрузки - выполняться, события - срабатывать и т.д.

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


Последний раз редактировалось FlexBuilder; 12.09.2006 в 00:11.
Старый 12.09.2006, 18:39
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 15  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
Код:
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.system.System;
	import flash.utils.Timer;

	public class Test extends Sprite {
		private var a:Sprite;
		private var timer:Timer;
		
		function Test():void {
			timer = new Timer(10);
			timer.addEventListener("timer", timerHandler);
			timer.start();
		}
		
		private function timerHandler(e:TimerEvent):void {			
			a = new Sprite();
			a.name = '#' + timer.currentCount;
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);
			
			addChild(a);
			removeChild(a);
			a=null;
		}
		
		private function efListner(e:Event):void {
			trace(e.currentTarget.name, (System.totalMemory/100000).toFixed(1));
		}
	}
}
моя версия доказательства работы GC - больше 2000 экземпляров одновременно в памяти не зависает
но вот заставить GC сработать когда я этого захочу (двойным LocalConnection()) мне не удалось :~/
__________________
Хороший отдых - половина работы.


Последний раз редактировалось artcraft; 12.09.2006 в 18:52.
Старый 12.09.2006, 19:41
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 16  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
ура я сделал это :~)
теперь для тестовых целей можно провацировать GC сработать тогда, когда это вам угодно

у меня срабатывает в течении 2-х секунд

Код:
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	public class Test extends Sprite {
		
		function Test():void {
			var a:Sprite = new Sprite();
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);			
			addChild(a);removeChild(a);a=null;
			
			function efListner(e:Event):void {trace('Please delete me...');}
			
			forceGCRun();
		}
		
		
		private function forceGCRun():void{
			var a:Sprite;
			var count:uint;
			var oldCount:uint;
			var timer:Timer;
			
			a = new Sprite();
			a.addEventListener(Event.ENTER_FRAME, efListner, false, 0, true);			
			addChild(a);removeChild(a);a=null;
			function efListner(e:Event):void {count++;}

			timer = new Timer(1000);
			timer.addEventListener("timer", timerHandler, false, 0, true);
			timer.start();
			
			function timerHandler(e:TimerEvent):void {
				if(oldCount == count){
					 trace(':)', timer.currentCount);
					 timer.stop(); timer=null;
				}
				oldCount = count;
				for (var n:uint=0; n<10000; n++){
					a = new Sprite();	addChild(a);removeChild(a);a=null;
				}
			}
		}
				

	}
}
__________________
Хороший отдых - половина работы.

Старый 15.09.2006, 18:47
artcraft вне форума Посмотреть профиль Отправить личное сообщение для artcraft Посетить домашнюю страницу artcraft Найти все сообщения от artcraft
  № 17  
Ответить с цитированием
artcraft
 
Аватар для artcraft

блогер
Регистрация: Aug 2005
Адрес: www.artcraft.cz
Сообщений: 1,967
Записей в блоге: 6
Отправить сообщение для artcraft с помощью ICQ
Цитата:
Сообщение от MerlinTwi
Ваще пипец...
Кнопка (клип типа Button) при изменении состояний Up-Over-Down (мышку над ней провели) генерит событие Event.REMOVED, которое могут ловят все ее родители
это конечно не приятно, но легко обходится

Код:
private function onRemove(e:Event):void{
  if( e.target == this){
     trace ('removed', e.target);
  }
}
__________________
Хороший отдых - половина работы.

Старый 24.10.2007, 07:58
Yuliy вне форума Посмотреть профиль Отправить личное сообщение для Yuliy Найти все сообщения от Yuliy
  № 18  
Ответить с цитированием
Yuliy

Регистрация: Aug 2007
Адрес: Украина, Киев
Сообщений: 21
Отправить сообщение для Yuliy с помощью ICQ
Забить память разными ненужными объектами, для того чтобы удалить "нужное" событие - не есть правильно!

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

Регистрация: Apr 2006
Адрес: Kursk, Russia
Сообщений: 523
Отправить сообщение для vooparker с помощью ICQ
http://www.flasher.ru/forum/showthread.php?t=100234

Что касается того что необходимо отписаться от событий, как правило для этих целей реализуют метод destoy или die, в котором производится чистка ресурсов и отписка от событий в том числе. то есть перед тем как удалить экземпляр вызываем destoy, конечно это усложняет немного жизнь но позволяет избежать многих утечек памяти
__________________
Челябинские флешеры настолько суровы, что пишут код во Flash IDE


Последний раз редактировалось vooparker; 24.10.2007 в 10:31.
Старый 24.10.2007, 12:33
LokiDi L0ck вне форума Посмотреть профиль Отправить личное сообщение для LokiDi L0ck Найти все сообщения от LokiDi L0ck
  № 20  
Ответить с цитированием
LokiDi L0ck

Регистрация: Oct 2007
Сообщений: 53
2vooparker, +1
Ручной контроль за удалением обработчиков соответствует принципу всех серьезных языков.
Автору рекомендую почитать "OReilly Essential ActionScript 3.0", там обрисованы все важные ситуации.
__________________
Новичок

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

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

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


 


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


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