サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

Starlingフレームワークを最適化するためのActionScriptの設定

ID: FN1207001 Product: Flash CS6 and above Platform: All Version: 11 and above/ActionScript 3.0

Starling Wiki「Performance Optimization」にコンテンツを最適化するコツが紹介されています。本稿はその中から、ActionScript 3.0の設定についての項目を解説します。


01 DisplayObject.blendModeプロパティをBlendMode.NONEに設定する

テクスチャが完全に不透明の矩形であれば、ブレンドをなしにするとGPUの負荷が減らせます。とくに大きな背景のイメージには有効です。表示オブジェクトの状態を変えることにはなるものの、それを上回る効果が期待できます。その場合には、DisplayObject.blendModeプロパティに定数BlendMode.NONEを設定します。

DisplayObjectオブジェクト.blendMode = BlendMode.NONE

02 Stage.colorプロパティの設定

背景が単色のときは、テクスチャやQuadインスタンスを置くのではなく、Stage.colorプロパティで色設定をしましょう。Starlingフレームワークは、フレームごとにステージを描替えます。つまり、Stage.colorプロパティを変えたからといって、新たな負荷が生じることはないのです。


03 DisplayObject.widthやDisplayObject.heightプロパティを繰返し参照することは避ける

DisplayObject.widthDisplayObject.heightプロパティの参照は、思いのほか演算の負荷が高いです。インスタンスの変換行列(回転/伸縮/移動)を調べて計算するからです。とくにSpriteに代表されるDisplayObjectContainerインスタンスでは、すべての子インスタンスについて変換行列の計算が繰返されることになります[*1]

forループなどの繰返し処理で同じプロパティを何度も参照するのは一般に避けるべきです(「ActionScriptでの最速を求める」01-03「forループで配列・Vectorを扱うときのお約束」参照)。とくに、DisplayObject.widthDisplayObject.heightプロパティについては、上述の理由によりその違いは大きいといえます。

// 避ける:
for (var i:int = 0; i < numChildren; ++i) {
  var child:DisplayObject = getChildAt(i);
  if (child.x > wall.width) {
    child.removeFromParent();
  }
}

// 望ましい:
var wallWidth:Number = wall.width;
for (var i:int = 0; i < numChildren; ++i) {
  var child:DisplayObject = getChildAt(i);
  if (child.x > wallWidth) {
    child.removeFromParent();
  }
}

[*1] DisplayObject.widthDisplayObject.heightプロパティを参照すると、内部的にはDisplayObject.getBounds()メソッドを呼出し、戻り値のRectangleオブジェクトから幅または高さが返されます。

public function get width():Number {
  return getBounds(mParent, sHelperRect).width;
}

DisplayObjectContainerクラスはこのメソッドをオーバーライド(override)します。そして、すべての子インスタンスの矩形領域を調べたうえで、それらが完全に含まれる矩形座標を求めてRectangleオブジェクトとして返します。

public override function getBounds(targetSpace:DisplayObject, resultRect:Rectangle = null):Rectangle {
  // ...[中略]...
  for (var i:int = 0; i < numChildren; ++i) {
    mChildren[i].getBounds(targetSpace, resultRect);
    minX = minX < resultRect.x ? minX : resultRect.x;
    maxX = maxX > resultRect.right ? maxX : resultRect.right;
    minY = minY < resultRect.y ? minY : resultRect.y;
    maxY = maxY > resultRect.bottom ? maxY : resultRect.bottom;
  }
  // ...[中略]...
  resultRect.setTo(minX, minY, maxX - minX, maxY - minY);
  return resultRect;
}


04 インスタンスのDisplayObject.touchableプロパティをfalseにする

マウスやタッチパネルの操作をすると、Starlingフレームワークはその対象となるインスタンスを調べます。この処理は負荷が上がります。すべてのDisplayObjectインスタンスに対して、DisplayObject.hitTest()メソッドを呼出すことになるからです。

そこで、マウス操作の対象とならないインスタンスは、予めDisplayObject.touchableプロパティfalseにしておきます。すると、Starlingフレームワークは、マウス操作を調べる対象からそのインスタンスを外します。できれば、個々の子インスタンスより、親インスタンスのプロパティを設定する方が効果は高いです。

// 望ましい:
var children:int = container.numChildren;
for (var i:int=0; i < children; ++i) {
  containter.getChildAt(i).touchable = false;
}

// より望ましい:
container.touchable = false;


05 Starling 1.2にEventDispatcher.dispatchEventWith()メソッドが加わった

Starling 1.2からEventDispatcher.dispatchEventWith()メソッドが加わります。このメソッドは、引数のイベントオブジェクトを新たにつくらずに使い回します。タイプが楽になるだけでなく、ガベージコレクションの手間が減ります。詳しくは「StarlingフレームワークにEventDispatcher.dispatchEventWith()メソッドが加わる」をお読みください。


作成者: 野中文雄
作成日: 2012年7月1日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.