Общие сведения о сборке мусора Actionscript

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

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

след общей системной памяти показал неуклонный рост, начиная примерно с 26 МБ до примерно 28 МБ примерно через минуту (или около того). внезапно он упал до 25 МБ только для того, чтобы снова продолжить расти. это, кажется, повторяется снова и снова.

вот некоторые вопросы, которые приходят на ум: 1. есть ли общая задержка по времени для сборщика мусора? 2. он активируется после выделения определенного объема памяти? 3. можно ли удалять объекты явно сразу, не полагаясь на сборщик мусора? 4. каков допустимый диапазон использования памяти при запуске flash?

прикреплен мой код.

import fl.transitions.*;
import fl.transitions.easing.*;

var shader:Shader;
var shaderFilter:ShaderFilter;
var motionTween:Tween;
var filterParameter:Number = 0.0;
var loader:URLLoader = new URLLoader();
var phase:Boolean = false;

loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, dataLoaded);
loader.load(new URLRequest("myBoringFilter.pbj"));

function dataLoaded(e:Event):void
 {
 loader.removeEventListener(Event.COMPLETE, dataLoaded);
 shader = new Shader(e.target.data);
 shaderFilter = new ShaderFilter(shader);
 flower.filters = [shaderFilter];

 tweenLoop(null);
 }

function tweenLoop(e:TweenEvent):void
 {
 if (motionTween != null)
  {
  motionTween.removeEventListener(TweenEvent.MOTION_CHANGE, updateFilter);
  motionTween.removeEventListener(TweenEvent.MOTION_FINISH, tweenLoop);
  motionTween = null;
  }

 phase = !phase;

 if (phase == true)
  {motionTween = new Tween(this, "filterParameter", Regular.easeOut, filterParameter, 100.0, 2.0, true);}
  else
  {motionTween = new Tween(this, "filterParameter", Regular.easeOut, filterParameter, -100.0, 1.0, true);}

 motionTween.addEventListener(TweenEvent.MOTION_CHANGE, updateFilter);
 motionTween.addEventListener(TweenEvent.MOTION_FINISH, tweenLoop);
 }

function updateFilter(e:TweenEvent):void
 {
 shader.data.amount.value = [filterParameter];
 flower.filters = [shaderFilter];

 //Update Memory
 trace("System Total Memory: " + System.totalMemory);
 }

person Chunky Chunk    schedule 04.03.2010    source источник


Ответы (1)


Как правило, это наиболее распространенный ресурс для этого вопроса:

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

person Matt W    schedule 04.03.2010
comment
Просто примечание: эта статья очень старая и (полностью) не применима к AS3. - person David Wolever; 15.10.2010