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にアップロードしてみました。