空のイベントハンドラメソッドは負荷がかかるか? [Edit]

mixiでこんな質問がありました。イベントハンドラメソッドに空のfunction(関数)を設定したとき、処理の負荷は増えるでしょうか? 理屈で考えると、Flash Playerからメソッドの呼出しが生じる分、CPUが使われるように思われます。簡単に、実験してみました。

以下のスクリプト001は、MovieClipインスタンス1,000個を新規に作成して、それらすべてのMovieClip.onEnterFrameイベントハンドラメソッドに空のfunction(名前のない関数)を設定しています。そのうえで、MovieClip.onEnterFrameイベントが100回発生するのに要する時間を計測します。フレームレートは、最高の120 fpsにしておきましょう。

スクリプト001■MovieClipを作成してonEnterFrameイベントハンドラメソッドを設定

var n:Number = 0;
for (var i:Number = 0; i<1000; i++) {
   var _mc:MovieClip = this.createEmptyMovieClip("my"+i+"_mc", i);
   _mc.onEnterFrame = function():Void {};
   // _mc.onEnterFrame = undefined;
}
var t:Number = getTimer();
this.onEnterFrame = function():Void {
   if (++n>100) {
     trace(getTimer()-t);
     delete this.onEnterFrame;
   }
};

筆者の環境(Flash Professional 8/Mac OS X.4.8 + PowerBook G4/1.67GHz/2GB RAM)では、イベントハンドラメソッドを設定すると、それがないときと比べて処理時間が3.5倍以上に膨らみました。

それに対して、MovieClip.onEnterFrameハンドラにundefiendを設定したときは、ほとんど処理時間は増えませんでした。したがって、この場合にはメソッドの呼出しは行われていないものと推測できます。もっとも、undefinedを設定したイベントハンドラメソッドは副次的な効果を伴います。その点には、注意しましょう。

その他の記事