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

[検証] visibleとremoveChild、どっちが高速か

WebDesining 2010 年 01 月号の SWF チューニング特集
* ActionScript 編で visible を false にする方法のほうが
* removeChild メソッドを使用した方法よりも高速になる
* と紹介されていた。これに疑問を感じたので検証してみた。
* (メモリ的にはremoveChildのほうが良いと紹介されていたが
*  それは正しいと思うのでスルー)
*
* よい検証方法が思いつかなかったので、結果はどちらもあまり変わらず。
* removeChild のほうが良さそうだけど、いかがでしょう?
*
* 表示/非表示切り替えだけであれば addChild/removeChild より
* visible のほうがコストは低そうですが、
* その意味で記事中にまとめられていたのでしょうか。
Get Adobe Flash player
by clockmaker 05 Feb 2010
    Embed
/**
 * Copyright clockmaker ( http://wonderfl.net/user/clockmaker )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/c19t
 */

/**
* WebDesining 2010 年 01 月号の SWF チューニング特集
* ActionScript 編で visible を false にする方法のほうが
* removeChild メソッドを使用した方法よりも高速になる
* と紹介されていた。これに疑問を感じたので検証してみた。
* (メモリ的にはremoveChildのほうが良いと紹介されていたが
*  それは正しいと思うのでスルー)
*
* よい検証方法が思いつかなかったので、結果はどちらもあまり変わらず。
* removeChild のほうが良さそうだけど、いかがでしょう?
*
* 表示/非表示切り替えだけであれば addChild/removeChild より
* visible のほうがコストは低そうですが、
* その意味で記事中にまとめられていたのでしょうか。
*/

package {
    import flash.display.*;
    import flash.events.*;
    import net.hires.debug.*;
    import com.bit101.components.*;
    
    public class FlashTest extends Sprite {
        private var arr:Array = [];
        private var btn0:PushButton;
        private var btn1:PushButton;
        private var btn2:PushButton;
        public function FlashTest() {
            stage.frameRate = 120;
            
            btn0 = new PushButton(this, 10, 10, "no touch", init);
            btn1 = new PushButton(this, 10, 40, "visible=false", init);
            btn2 = new PushButton(this, 10, 70, "removeChild", init);
        }
        
        private function init(e:Event):void
        {
            removeChild(btn0);
            removeChild(btn1);
            removeChild(btn2);
            
            for(var i:int=0; i<100; i++)
            {
                var sp:Sprite = new Sprite();
                for(var j:int=0; j<100; j++)
                {
                    sp.graphics.beginFill(0xFFFFFF * Math.random());
                    sp.graphics.drawCircle(20 * (Math.random() - 0.5), 20 * (Math.random() - 0.5), 10);
                }
                sp.x = 465 * Math.random();
                sp.y = 465 * Math.random();
                arr[i] = sp;
                addChild(sp);
                
                if(e.currentTarget == btn1) sp.visible = false;
                if(e.currentTarget == btn2) removeChild(sp);
            }
            
            addEventListener(Event.ENTER_FRAME, loop);
            
            addChild(new Stats);
        }
        
        private function loop(e:Event):void
        {
            for(var i:int=0; i<arr.length; i++)
            {
                var sp:Sprite = arr[i] ;
                sp.x --;
                if(sp.x < 0)
                    sp.x = 465;
            }
        }
    }
}