В попытке увидеть и, надеюсь, понять сборщик мусора Actionscript, я настроил пример проекта, который циклически изменяет значение параметра пиксель-загиб на сцене.
Моей первой проблемой было количество памяти, которое использовалось при запуске (~ 26 МБ). хотя мне нравится верить, что я осторожен с памятью, удаляя слушателей событий и обнуляя ненужные объекты для сборки мусора, я также считаю, что не до конца понимаю, где, почему и когда это работает.
след общего объема системной памяти показывал устойчивый рост, начиная примерно с 26 МБ до примерно 28 МБ примерно через минуту (или около того). внезапно он упал до 25 МБ, чтобы продолжить рост. кажется, это повторяется снова и снова.
вот несколько вопросов, которые приходят на ум:
1. есть ли общая задержка для сборщика мусора?
2. активируется ли после выделения определенного количества памяти?
3. Можно ли сразу удалять объекты, не полагаясь на сборщик мусора?
4. Каков допустимый диапазон использования памяти при работе с флэш-памятью?
прикреплен мой код.
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);
}