playground内の描画仕組み

10
第 7 第第第第第第第 PLAYGROUND 第第第第第第第 第第第 第第第

Upload: romainpiquois

Post on 21-Jun-2015

2.227 views

Category:

Technology


1 download

DESCRIPTION

Slide describing the playgroung 2D game engine rendering system.

TRANSCRIPT

Page 1: Playground内の描画仕組み

第 7 回テックヒルズ

PLAYGROUND 内の描画仕組み ロマン ピコア

Page 2: Playground内の描画仕組み

現代のモバイル用描画パイプライン

Vertex Gather

Vertex ShaderPrimitive Assembly

Rasterizer

Pixel ShaderDepth / StencilBuffer BlendDither 固定機能

プログラム可能

ある状態に設定し、実行します。

ベクターデータ

画像

Page 3: Playground内の描画仕組み

状態の変更のコスト

Vertex Gather

Vertex ShaderPrimitive Assembly

Rasterizer

Pixel ShaderDepth / StencilBuffer BlendDither

フレームn フレームn+1

実行順

Page 4: Playground内の描画仕組み

実行回数や負担を減らすための一般方法まったく描画しないために処理 ピクセル毎の負担を減らす又ステート変更を減

らすカメラの空間に無い物を描画しない。 ( カリン

グ )

高級なゲームはモデル Occlusion を計算

透明ではないオブジェクトを「近く遠く」にソート

透明であるオブジェクトを「遠く近く」にソート

シェーダーの種類・パラメターでソートテクスチャーでソートA A A B B B

Page 5: Playground内の描画仕組み

モバイル、 2D の場合 Shader 数が少ない、変わらないゲームも多い。

画像と α ブレンド・足し算ブレンドはほとんど。

透明ではない物はほとんどありません:背景のみ。 Z Buffer のトリックは無意味。

3D に比べてベクターデータ / 頂点が少ない。

塗る面積が 3D とやや同じ・もっと大きいかも。 (Overdraw)

Page 6: Playground内の描画仕組み

次のボトルネック:切り替えより回数減らそう

描画回数を減らすため、ステートが同じなら、バッチを実現。

複数の描画命令を同じステートなら、同じ頂点リストにまとめて、実行数を減らす。変わりに CPU が Vertex Shader の計算の一部を自前で計算し、バッファー作成する。

一回で描画

4 回実行 ( 頂点情報だけが違う)

Page 7: Playground内の描画仕組み

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

描画時にバッチバッファにまとめる

同じステートで実行

Page 8: Playground内の描画仕組み

速度を保つためにはキャッシュ & フラグ

シーングラフのノード

① 変わった時にフラグのみを変更

② 変更された所だけの Matrix を再計算 ( フラグがあるため、最適化ができて、無駄な計算せずにすむ )

XY UV

2DモデルXYUV

COLXYUVXYUVXYUV

2Dインスタンス

③ 変更された時だけに Matrix をかけて、画面空間でXY を計算。そして XYUV をインターレス化:キャッシュ

COL

XYUV

Index

Index

④ フラグによって、コピーの最適化 : XYUV, COLOR, INDEX

Page 9: Playground内の描画仕組み

気になる、 Cocos 2D はどうしている?

見た限り、バッチは可能ですが、純粋にプログラマーの責任

Page 10: Playground内の描画仕組み

気になる、 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# で自前でバッチする。