为了查看并希望了解 actionscript 的垃圾收集器,我设置了一个示例项目,该项目在舞台上循环补间像素弯曲器参数的值。
我首先关心的是启动时使用的内存量(~26 MB)。虽然我相信我通过删除事件侦听器和尽可能清空垃圾收集的无用对象来对内存持谨慎态度,但我也相信我并不完全了解它在何处、为什么以及何时起作用。
总系统内存的跟踪显示从大约 26 MB 开始稳步上升,直到大约一分钟后(大约)后大约 28 MB。突然,它骤降到 25 MB,然后又继续上升。这似乎一遍又一遍地循环。
以下是一些浮现在脑海中的问题: 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);
}