[AS3] Starlingフレームワークを最適化するSpriteオブジェクトのフラット化とQuadBatchクラス [Edit]

Starlingフレームワークで子インスタンスをもてるオブジェクトとしては、Spriteがもっぱら使われます。その子オブジェクトの見た目がしばらく変わらないときは、Sprite.flatten()メソッドを呼出すと描画が最適化されます。その描画を速めるために、おもに内部的に用いられるのがQuadBatchクラスです。Starling Wiki「Performance Optimization」に解説されていた内容から、ふたつの項目を採上げてご紹介します。

Spriteオブジェクトのフラット化

Starlingフレームワークは、表示リストのすべてのオブジェクトの状態を確かめて、毎フレームそのデータをGPUにアップロードします。

もし、子インスタンスの描画は変わらないというSpriteオブジェクトがあったら、Sprite.flatten()メソッドを呼出してください。Starlingは子インスタンスを予め処理して、データをGPUにアップロードします。すると、以降のフレームでは、そのデータがそのまま描かれます。その処理にCPUは使われませんし、GPUにデータが送られることもありません。

Spriteオブジェクトをフラット化すると、描画が速まるうえ、CPUの負荷も減らせます。ただし、状態が変われば再描画されます。また、状態の異なる子インスタンスが含まれていれば、それぞれは分けて描かれることになります。

SpriteクラスとSprite.flatten()メソッドについて詳しくは、「starling.display.Spriteクラス」をお読みください。

QuadBatchクラス

Spriteオブジェクトはフラット化すれば描画が速まるものの、まだ難点もあります。

  • Spriteオブジェクトに子オブジェクトを加えると、Event.ADDEDEvent.ADDED_TO_STAGEイベントが配信されるので、子オブジェクトを増やすと負荷が高まる。
  • Spriteを含めたDisplayObjectContainerインスタンスには、ひとつの子オブジェクトはひとつの親インスタンスにひとつしか加えられない。

Starlingフレームワークが描画をまとめるために内部的に用いている低レベルのクラスQuadBatchなら、これらの問題はなくなります。ひとつのQuadインスタンスをいくつでも加えられるうえ、いちいちイベントが配信されません。

もっとも、QuadBatchオブジェクトには、別の難点もあります。

  • 加えるオブジェクトは、すべて同じ状態になる。
  • 加えられるのはImageとQuad、およびQuadBatchオブジェクトだけ。
  • 後から状態を変えたり、加えたオブジェクトを除くには、リセットするしかない。

これらさえ問題なければ、QuadBatchオブジェクトはSpriteとQuadおよびImageを加えた表示オブジェクト四天王の中で間違いなく描画は最速です。

QuadBatchクラスについて詳しくは、「starling.display.QuadBatchクラス」をお読みください。

その他の記事