Performance Optimization of Starling frameworkStarlingフレームワークの最適化
Starling Wiki「Performance Optimization」(パフォーマンスの最適化)を題材として、おもな内容の紹介と考察を加える。 01 状態の変更をできるだけ少なく画面に描かれる表示オブジェクト(DisplayObject)を代表するのがQuadオブジェクト。テクスチャを表示するImageオブジェクトもQuadクラスを継承する。 01-01 状態を決めるプロパティStarlingは多くのQuadオブジェクトを、できるだけまとめてGPUに送ろうとする。ところが、異なる「状態」(state)のQuadオブジェクトがあると、「状態の変更」(state change)が起こる。すると、それまでにまとめたQuadオブジェクトが送られて描画されてしまう。
01-02 Quadオブジェクトの着色モバイルデバイスでは、テクスチャに「着色」すると描画が滑らかでなくなることがある。
着色のあるなしを頻繁に変えるより、親オブジェクトに1未満(たとえば0.999)のアルファを設定する。 01-03 Starling.showStatsプロパティでフレーム当たりの描画数を確かめるStarling.showStatsプロパティをtrueにすると、コンテンツの動作情報が示される。最新のバージョンではフレーム当たりの描画回数が確かめられるので、その数をできるだけ少なく抑える。 02 表示オブジェクトの描画を最適化する02-01 画家のアルゴリズムStarlingフレームワークはFlashと同じく、背面の表示オブジェクトから順に手前のオブジェクトを塗り重ねる(図001)。これを「画家のアルゴリズム」という。 図001■遠景から順に近景を塗り重ねていく 最背面から重ね順にしたがって描かれる表示オブジェクトは、状態が同じであればGPUでまとめて描画される。表示リストをつくるときも、描画の順序を考えなければならない(図002)。 図002■表示オブジェクトを重ね順に応じて3つのSpriteインスタンスにまとめる 02-02 テクスチャアトラス表示オブジェクトのテクスチャが異なると、状態は違うことになる。しかし、同じテクスチャアトラスからロードすれば状態は同じと扱われ、Starlingフレームワークは一度に描画できる(図003)。 図003■表示オブジェクトのテクスチャをひとつのアトラスからロードすれば一度に描画できる テクスチャアトラスは、スプライトシートからつくる(図004)。手順とスクリプティングについては、ADC OnAir「Stage3Dを学ぼう!Flashで2Dコンテンツ」(録画01:17:30-01:33:30)、またはAdobe Developer Connection「Starlingフレームワークのスプライトシートを使ったアニメーション」参照。 図004■[ライブラリ]のシンボルを右クリックして[スプライトシートを生成]アトラスの大きさは、2048×2048ピクセル以内(一部のモバイルデバイスにおけるテクスチャの最大値)。テクスチャアトラスを分けるときは、表示オブジェクトの重ね順でまとめる(図005)。 図005■テクスチャアトラスは表示オブジェクトの重ね順でまとめる03 Spriteオブジェクトのフラット化とQuadBatchクラスSpriteインスタンスに加えた子オブジェクトの見た目がしばらく変わらないときは、Sprite.flatten()メソッドを呼出すと描画が最適化される。その描画を速めるために、おもに内部的に用いられるのがQuadBatchクラスだ。 03-01 Spriteオブジェクトのフラット化Sprite.flatten()メソッドを呼出しすと、Starlingは子インスタンスを予め処理して、データをGPUにアップロードする。すると、以降のフレームでは、そのデータがそのまま描かれ、CPUは使われない。 03-02 QuadBatchクラスSpriteオブジェクトはフラット化すれば描画が速まるものの、まだ難点もある。
低レベルのクラスQuadBatchなら、これらの問題はなくなる。ひとつのQuadインスタンスをいくつでも加えられるうえ、いちいちイベントが配信されない。QuadBatchオブジェクトの描画は、SpriteとQuadおよびImageを含めた表示オブジェクト四天王の中で間違いなく最速! ただし、つぎの点に注意しなければならない。
ひとつのImageオブジェクト(myImage)を複数QuadBatch.addImage()メソッドでインスタンスに納めた例(図006)。
図006■ひとつのImageオブジェクトが複数描かれた 04 Starlingフレームワークを最適化するActionScriptの設定04-01 DisplayObject.blendModeプロパティをBlendMode.NONEに設定するテクスチャが完全に不透明の矩形であれば、ブレンドをなしにするとGPUの負荷が減らせる。 DisplayObjectオブジェクト.blendMode = BlendMode.NONE 04-02 Stage.colorプロパティの設定背景が単色のときは、テクスチャやQuadインスタンスを置くのではなく、Stage.colorプロパティで色設定する。 04-03 DisplayObject.widthやDisplayObject.heightプロパティを繰返し参照することは避けるDisplayObject.widthやDisplayObject.heightプロパティの参照は、演算の負荷が高い。インスタンスの変換行列(回転/伸縮/移動)を調べて計算するためだ。とくにSpriteに代表されるDisplayObjectContainerインスタンスでは、すべての子インスタンスについて変換行列の計算が繰返される。
04-04 インスタンスのDisplayObject.touchableプロパティをfalseにするマウスやタッチパネルの操作をすると、Starlingフレームワークはその対象となるすべてのDisplayObjectインスタンスに対して、DisplayObject.hitTest()メソッドを呼出すので負荷が上がる。マウス操作の対象とならないインスタンスは、予めDisplayObject.touchableプロパティをfalseにしておくとよい。
04-05 Starling 1.2にEventDispatcher.dispatchEventWith()メソッドが加わる引数のイベントオブジェクトを新たにつくらずに使い回しまして、イベントを配信する。ガベージコレクションの手間が減る。なお、第2引数はイベントをバブリングさせるかどうかのブール(論理)値。
EventDispatcher.dispatchEventWith()メソッドの第3引数に任意のObject型の値を渡すと、イベントオブジェクトにそのデータが加えられる。そのために、Eventクラスには新たにEvent.dataプロパティ(Objectデータ型)が備わった。
EventDispatcher.dispatchEventWith()メソッドの第3引数に渡した値は、イベントリスナーの第2引数でも受取れる。リスナー関数の引数は、必要がなければすべて省いてしまっても構わない。
定義済みのイベントについてもリスナーの引数などを柔軟に定めるEventDispatcher.addEventListenerWith()メソッド(ただし、このメソッドは本講演時現在のEventDispatcherクラスには未搭載)。
おまけ Starling Wikiで紹介されたActionScript 3.0最適化のコツ
作成者: 野中文雄 Copyright © 2001-2012 Fumio Nonaka. All rights reserved. |
|||||||||||||||