![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: 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() );
}
}
Значит useWeakReference из функции addEventListener работает корректно, и его можно использовать для событий типа click, mouse..., focus... Которые зависят от самого мувика. Для событий срабатывающих самостоятельно, типа enterFrame, activate... придется прописывать отдельную функцию на удаление всех созданных Listeners и запускать ее вручную или по Event.REMOVED, смотря по ситуации. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Есть, только по ней смотреть не получается. Если флеш отхавал кусок памяти, то даже после удаления всего хлама он не торопится память освобождать, и получается, что System.totalMemory показывает не сколько памяти требуется в конкретно данный момент, а сколько всего пришлось выделить в пике.
|
|
|||||
|
Регистрация: Aug 2006
Сообщений: 70
|
по просьбе Merlin-а перевод сообщения artcraft (мерси ему за цитату)
http://www.gskinner.com/blog/archive...source_ma.html Очень важная вещь, которую нужно понимать при работе со сборщиком мусора в 9-м флешплеере, заключается в том, что эта операция является отложенной. Ваши объекты не будут уничтожены немедленно после того, как все активные ссылки будут удалены, напротив они будут уничтожены лишь через некоторое неопределенное (с точки зрения разработчика) время. Сборщик мусора использует набор эвристических алгоритмов, которые контролируют распределение ОЗУ и размер стека (а также другие факторы) для принятия решения о чистке. Как разработчик вы должны смириться с фактом, что вам не остается никакой возможности для того, чтобы узнать когда (и даже убедиться что) ваши неактивные объекты будут уничтожены. Вам также необходимо знать, что неактивные объекты продолжают выполняться неограничено, (до тех пор пока сборщик мусора не удалит их), а значит код будет продолжать выполняться (например enterFrames), звуки - играть, загрузки - выполняться, события - срабатывать и т.д. Очень важно помнить, что у вас нет никаких методов для управления моментом, когда ваши объекты будут удалены из памяти, в связи с чем, вы должны сделать их максимально пассивными и не взаимодействующими с другими объектами в тот момент когда вы заканчиваете работу с этими объектами. Последний раз редактировалось FlexBuilder; 12.09.2006 в 00:11. |
|
|||||
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 сработать когда я этого захочу (двойным LocalConnection()) мне не удалось :~/
__________________
Хороший отдых - половина работы. Последний раз редактировалось artcraft; 12.09.2006 в 18:52. |
|
|||||
|
ура я сделал это :~)
теперь для тестовых целей можно провацировать 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;
}
}
}
}
}
__________________
Хороший отдых - половина работы. |
|
|||||
|
Цитата:
__________________
Хороший отдых - половина работы. |
|
|||||
|
Забить память разными ненужными объектами, для того чтобы удалить "нужное" событие - не есть правильно!
|
|
|||||
|
http://www.flasher.ru/forum/showthread.php?t=100234
Что касается того что необходимо отписаться от событий, как правило для этих целей реализуют метод destoy или die, в котором производится чистка ресурсов и отписка от событий в том числе. то есть перед тем как удалить экземпляр вызываем destoy, конечно это усложняет немного жизнь но позволяет избежать многих утечек памяти
__________________
Челябинские флешеры настолько суровы, что пишут код во Flash IDE Последний раз редактировалось vooparker; 24.10.2007 в 10:31. |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 53
|
2vooparker, +1
Ручной контроль за удалением обработчиков соответствует принципу всех серьезных языков. Автору рекомендую почитать "OReilly Essential ActionScript 3.0", там обрисованы все важные ситуации.
__________________
Новичок |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|