actionscript のガベージ コレクターを確認し、できれば理解するために、ステージ上でピクセル ベンダー パラメーターの値をループ トゥイーンするサンプル プロジェクトをセットアップしました。
私の最初の懸念は、起動時に使用されていたメモリの量 (~26 MB) でした。イベントリスナーを削除し、ガベージコレクションの不要なオブジェクトを可能な限り無効にすることで、メモリに注意していると信じたいのですが、それがどこで、なぜ、いつ機能するかを完全には把握していないと思います。
合計システム メモリのトレースでは、約 26 MB から始まり、約 1 分後 (またはその程度) 後に約 28 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);
}