サイトトップ

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

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

starling.display.QuadBatchクラス

ID: FN1206004 Platform: All Version: CS6/ActionScript 3.0 Runtime: Flash Player 11/AIR 3.0

QuadBatchクラス
パッケージ   starling.display
継承   QuadBatch → DisplayObject → EventDispatcher → Object
プロパティ
numQuads:int
[読取り専用]
メソッド
QuadBatch()
バッチデータが空の新たなQuadBatchインスタンスをつくる。
addImage(image:Image, parentAlpha:Number = 1.0, modelViewMatrix:Matrix3D = null, blendMode:String = null):void
バッチにImageオブジェクトを加える。
addQuad(quad:Quad, parentAlpha:Number = 1.0, texture:Texture = null, smoothing:String = null, modelViewMatrix:Matrix3D = null, blendMode:String = null):void
バッチにQuadオブジェクトを加える。
clone():QuadBatch
QuadBatchオブジェクトを複製する。
compile(container:DisplayObjectContainer, quadBatches:Vector.<QuadBatch>):void
[静的] Quadオブジェクト(とそれらを含むDisplayObjectContainerオブジェクト)からなるDisplayObjectContainerインスタンスを解析して、そのインスタンスが表せるQuadBatchベース型のVectorオブジェクトをつくる。
dispose():void
[オーバーライド] 頂点バッファとインデックスバッファを破棄する。
getBounds(targetSpace:DisplayObject, resultRect:Rectangle = null):Rectangle
[オーバーライド] QuadBatchインスタンスがすべて包まれる矩形領域のRectangleオブジェクトを、指定されたDisplayObjectインスタンスの座標系でつくって返す。
isStateChange(quad:Quad, parentAlpha:Number, texture:Texture, smoothing:String, blendMode:String):Boolean
Quadオブジェクトが状態を変えることなくバッチに加えられるかどうか示す。
render(support:RenderSupport, parentAlpha:Number):void
[オーバーライド] RenderSupportオブジェクトを用いて、DisplayObjectインスタンスを描画する。
renderCustom(mvpMatrix:Matrix3D, parentAlpha:Number = 1.0, blendMode:String = null):void
現在のバッチを、指定したmodel-view-projection行列とアルファ、およびブレンドモードで描く。
reset():void
バッチをリセットする。

説明
状態が同じ複数のQuadオブジェクトの描画を最適化します。

Starlingフレームワークでステージに表示するオブジェクト(DisplayObject)として、もっともよく使われるのがQuadオブジェクトです(テクスチャを表示するためにやはりよく用いられるImageオブジェクトもQuadクラスを継承します)。同じ状態のQuadオブジェクトをまとめて一気にGPUに送ると、描画はきわめて速くなります。そのために備えられたのがQuadBatchクラスです。

SpriteクラスSprite.flatten()メソッドは、内部的にQuadBatchクラスを用いて描画を速めます。多くの場合、フラット化したSpriteオブジェクトの方が使いやすいでしょう。ただ、QuadBatchクラスを直接用いると、つぎのような利点があります。

  • QuadBatchオブジェクトには、ひとつのQuadオブジェクトをいくつでも加えられる。
  • QuadBatchオブジェクトにオブジェクトを加えても、Event.ADDEDEvent.ADDED_TO_STAGEイベントの配信がないのでその分負荷が軽い。

ひとつのQuadBatchオブジェクトには、ひとつの描画状態が定められます。QuadBatchオブジェクトの状態は、初めに加えるオブジェクトで決まります。状態には、用いるテクスチャや、スムージング、ブレンド、着色(頂点カラーや不透明度)などの設定が含まれます。QuadBatch.reset()メソッドを呼出すと、大きさは保ったままバッチが空になり、新たな状態のQuadオブジェクトが加えられます。

QuadBatchクラスはDisplayObjectクラスを継承します。けれど、表示リストの階層に必ずしも加えなくて構いません。クラスのrender()メソッドの中から、QuadBatch.renderCustom()メソッドに変換行列やアルファ、ブレンドなどの値を渡して呼出すことができます。

QuadBatchクラスにはつぎのような制約があります[*1]。これらが問題にならなければ、QuadBatchオブジェクトを用いるのが、Starlingフレームワークの中でもっとも速く描画する方法になります。

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

[*1] なお、Starling Wiki「Performance Optimization」も併せてご参照ください。


つぎのスクリプト(抜粋)は、QuadBatchインスタンス(myQuadBatch)を表示リストに加え、ひとつのImageオブジェクト(myImage)を複数QuadBatch.addImage()メソッドでインスタンスに納めています(図001)。

var myQuadBatch:QuadBatch = new QuadBatch();
var myImage:Image = new Image(myTexture);
mySprite.addChild(myQuadBatch);
myQuadBatch.addImage(myImage);
for (var i:uint = 0; i < 5; i++) {
  myImage.x += 20;
  myQuadBatch.addImage(myImage);
}

図001■ひとつのImageオブジェクトが複数描かれた
図001

参考
[Starling Framework Reference] > [QuadBatch]


作成者: 野中文雄
作成日: 2012年6月8日


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