In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

FP11の新機能 pauseForGCIfCollectionImminent()

FP11の新機能pauseForGCIfCollectionImminent()メソッドのテスト

スライダーを動かし、ボタンをクリックしてみてください
0に近いほどGCが発動しやすく、1に近いほど発動しにくくなります

右クリックしてShow Profilerを選ぶともう一つのプロファイラーを表示します

・pauseForGCIfCollectionImminent()メソッド
pauseForGCIfCollectionImminent()メソッドは引数に閾値を与えて実行します。値は0から1の範囲でデフォルトは0.75です。
このメソッドを実行したときに、ガベージコレクターがその閾値以上の緊急度だった場合にGCが発動します

つまり、0にした場合全くGCする必要がなくても発動する可能性が高くなり、1にした場合はどんな場合でも発動しません(多分)

このメソッドを実行したからといって通常のGCが発動しなくなるわけではないようです
Get Adobe Flash player
by ton 20 Oct 2011

    Talk

    bkzen at 20 Oct 2011 16:36
    たぶんだけど GC が動くのって「処理に余裕がある時」なんじゃない? 今のサンプルだと処理に余裕がありすぎるから、ほぼGCが動く状態なのでは。
    Fumio at 20 Oct 2011 16:50
    ドキュメントから解釈するかぎり、小分けにした処理1回ごとの時間的な軽さと、リソースの逼迫度の見合いで決まるのが「切迫度」(imminence)のようです。ですから、メモリを目一杯使って細かくアニメーションさせるような状況でないと、「実感」はしづらいのではないでしょうか。

    Tags

    Embed
/**
 * Copyright ton ( http://wonderfl.net/user/ton )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/7Xlb
 */

package
{
    import com.bit101.components.HSlider;
    import com.bit101.components.Label;
    import com.bit101.components.PushButton;
    import com.flashdynamix.utils.SWFProfiler;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.System;
    import net.hires.debug.Stats;
    
    public class Main extends Sprite 
    {
        private var GUI:Sprite;        
        private var slider:HSlider;
        private var label:Label;
        private var button:PushButton;
        
        public function Main():void 
        {
            GUI = new Sprite();
            addChild(GUI);
            
            slider = new HSlider(GUI, 0, 4, changeLabel);
            slider.maximum = 100;
            slider.tick = 1;
            slider.value = 75;
            
            label = new Label(GUI, slider.width, 0, String(slider.value / 100));
            
            button = new PushButton(GUI, label.x + label.width, 0, "GC!", changeImminence);
            
            GUI.x = stage.stageWidth - GUI.width - 150;
            GUI.y = stage.stageHeight - GUI.height - 10;
            
            SWFProfiler.init(this);        
            
            var stats:Stats = new Stats( { bg:0x0, fps:0x0, ms:0x0, mem:0xff0000, memmax:0x00ff00 } );
            stats.scaleX = stats.scaleY = 3;
            stats.y = 120
            addChild(stats);
            
            addEventListener(Event.ENTER_FRAME, update);
        }
        
        private function changeLabel(e:Event):void 
        {
            label.text = String(slider.value/100);            
        }
        
        private function changeImminence(e:Event):void 
        {
            System.pauseForGCIfCollectionImminent(slider.value / 100);
        }
        
        private function update(e:Event):void 
        {
            for (var i:int = 0; i < 20; i++) 
            {
                new MovieClip();
            }                
        }
    }
}