addChildAt(child, 0)は処理が速い [Edit]

DisplayObject(またはそのサブクラスの)インスンスをタイムライン(厳密にはDisplayObjectContainerインスタンス)の子として加えるとき、通常はDisplayObjectContainer.addChild()メソッドを使います。しかし、大量の子インスタンスを一気に追加する場合には、DisplayObjectContainer.addChildAt()メソッドを使うと処理は速くなることがあるようです。

DisplayObjectContainer.addChildAt()メソッドのシンタックスは、つぎのとおりです。メソッドには、第1引数の子インスタンスに加えて、第2引数として表示リストにおけるインデックス番号(整数)を指定します。

addChildAt(子インスタンス:DisplayObject, インデックス:int):DisplayObject

この第2引数のインデックスに0を指定すると、DisplayObjectContainer.addChild()メソッドよりも処理は明らかに速くなるようです。

DisplayObjectContainer.addChild()メソッドは子インスタンスを表示リストの最後に加えますので、DisplayObjectContainer.addChildAt()メソッドでインデックスを0に指定すると、表示リスト内の子インスタンスの位置は異なってきます。しかし、その順序は問わない場合や、forループ処理でカウンタ変数を減算(カウントダウン)することで対応できるようなときには、試してみる価値があるでしょう。

テスト用のフレームアクションは、つぎのスクリプト001のとおりです。

スクリプト001■addChildAt(child, 0)とaddChild(child)を比較するテスト用フレームアクション

// フレームアクション
var n:int = 10000;
var a0:int = 0;
var a1:int = 0;
var sprite0:Sprite = new Sprite();
var sprite1:Sprite = new Sprite();
addChild(sprite0);
addChild(sprite1);
loopTest();
function loopTest():void {
  var t0:int = loop0();
  var t1:int = loop1();
  var _str:String = "";
  _str += "0: " + t0 + ", ";
  _str+="1: "+t1+", ";
  _str+="ratio: "+t0/t1;
  trace(_str);
}
function loop0():int {
  var t:int=getTimer();
  for (var i:int=0; i<n; i++) {
    var mySprite:Sprite = new Sprite();
    sprite0.addChildAt(mySprite, 0);
  }
  return getTimer() - t;
}
function loop1():int {
  var t:int=getTimer();
  for (var i:int=0; i<n; i++) {
    var mySprite:Sprite = new Sprite();
    sprite1.addChild(mySprite);
  }
  return getTimer() - t;
}


[*1] なお、複数環境で確かめやすいように、ドキュメントクラスに定義したテストサンプルをwonderflにアップロードしてみました。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事