试图查看并希望了解actionscript的垃圾收集器,我已经设置了一个示例项目,它在舞台上循环显示像素弯曲器参数的值。
我首先关注的是启动时使用的内存量(~26 MB)。虽然我想通过删除事件监听器并尽可能地为垃圾收集废弃无用的对象来相信我对内存持谨慎态度,但我也相信我并不完全掌握它在哪里,为什么以及何时起作用。
总系统内存的跟踪显示从大约26 MB开始稳定上升,大约一分钟后(大约一分钟)。它突然下降到25 MB只是为了再次继续上升。这似乎一遍又一遍地循环。
这里有一些问题浮现在脑海中: 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);
}
答案 0 :(得分:2)