playground内の描画仕組み
DESCRIPTION
Slide describing the playgroung 2D game engine rendering system.TRANSCRIPT
第 7 回テックヒルズ
PLAYGROUND 内の描画仕組み ロマン ピコア
現代のモバイル用描画パイプライン
Vertex Gather
Vertex ShaderPrimitive Assembly
Rasterizer
Pixel ShaderDepth / StencilBuffer BlendDither 固定機能
プログラム可能
ある状態に設定し、実行します。
ベクターデータ
画像
状態の変更のコスト
Vertex Gather
Vertex ShaderPrimitive Assembly
Rasterizer
Pixel ShaderDepth / StencilBuffer BlendDither
フレームn フレームn+1
実行順
実行回数や負担を減らすための一般方法まったく描画しないために処理 ピクセル毎の負担を減らす又ステート変更を減
らすカメラの空間に無い物を描画しない。 ( カリン
グ )
高級なゲームはモデル Occlusion を計算
透明ではないオブジェクトを「近く遠く」にソート
透明であるオブジェクトを「遠く近く」にソート
シェーダーの種類・パラメターでソートテクスチャーでソートA A A B B B
モバイル、 2D の場合 Shader 数が少ない、変わらないゲームも多い。
画像と α ブレンド・足し算ブレンドはほとんど。
透明ではない物はほとんどありません:背景のみ。 Z Buffer のトリックは無意味。
3D に比べてベクターデータ / 頂点が少ない。
塗る面積が 3D とやや同じ・もっと大きいかも。 (Overdraw)
次のボトルネック:切り替えより回数減らそう
描画回数を減らすため、ステートが同じなら、バッチを実現。
複数の描画命令を同じステートなら、同じ頂点リストにまとめて、実行数を減らす。変わりに CPU が Vertex Shader の計算の一部を自前で計算し、バッファー作成する。
一回で描画
4 回実行 ( 頂点情報だけが違う)
Playground では ?
XY UV
COLXY
モデル : XY バッファ / UV バッファ
インスタンス : Color + XYUV BufferUV
XY
UV
XY
UV
インスタンス化 + 2D Matrix をかける(状態キャッシュ)
COL COL COL COL COL
XY
UV
XY
UV
XY
UV
XY
UV
XY
UV
XY
UV
XY
UV
XY
UV
XY
UV
COL
…
…
…
…
描画時にバッチバッファにまとめる
同じステートで実行
速度を保つためにはキャッシュ & フラグ
シーングラフのノード
① 変わった時にフラグのみを変更
② 変更された所だけの Matrix を再計算 ( フラグがあるため、最適化ができて、無駄な計算せずにすむ )
XY UV
2DモデルXYUV
COLXYUVXYUVXYUV
2Dインスタンス
③ 変更された時だけに Matrix をかけて、画面空間でXY を計算。そして XYUV をインターレス化:キャッシュ
COL
XYUV
Index
Index
④ フラグによって、コピーの最適化 : XYUV, COLOR, INDEX
気になる、 Cocos 2D はどうしている?
見た限り、バッチは可能ですが、純粋にプログラマーの責任
気になる、 Unity はどうしている?
普段の場合、 Unity の仕様を見ると、 Batching of static model done by Unity Pro. Batching of dynamic model done by Unity. (=Playground と同じ動
作) Culling done by Unity
普通に 3D モデルで 2D を描画する作業なら、バッチ機能がやってくれるはず。
しかし 2D ライブラリの場合、ライブラリ次第です。例えば、 ex2D ライブラリは C# で自前でバッチする。