描画の効率化

モバイル環境に対応するのはもちろんだが、全般的にPCより非力な(と考えられる)モバイルデバイスのこと。計算量の大きな描画処理は可能な限り効率的であるに越したことはない。ここまでの作業は

とりあえずタスクから操作できるScenegraphを用意して、
操作したとおりにオブジェクトが動き、
描画されることでshaderの動作が正しいことが確認できる

ことが主眼だった。
ひとまずそこが落ち着いた以上、ここから先は

描画効率を最大化する

方向にいかねばならない。

これまではScenegraphをスキャンして全オブジェクトのworld matrixを算出した後、再度Scenegraphをスキャンして描画物を伴うオブジェクトを見つけたらそれを描画していたが、Scenegraph中にはNullオブジェクトやカメラオブジェクトなど「位置と回転の情報は持つが、それ自体は描画されないオブジェクト」も含まれている。それらの非表示オブジェクトを辿る処理時間が勿体ないという点と、現在描画オブジェクトを見つけるたびに都度頂点バッファやインデックスバッファをBindしているのが非効率だという点を何とかする作業。

ポイントは以下の通り。

  • Scenegraphの木構造とは別系統の描画物オブジェクトだけを辿れるリスト構造を持てば、非表示オブジェクトを端的に無視して描画できる。
  • 同じモデルデータを利用する場合、頂点やインデックスの情報は全く同じで異なるのはmatrixや固有RGBA係数など「オブジェクト固有値だけ」である

ということで、下記のように修正。

  • 描画環境singletonに「現在使われているモデル情報のリスト」を持たせる。
  • 各モデル情報に「そのモデルを利用しているオブジェクトのリスト」を持たせる。

これで、モデル情報単位で共有情報の設定を行った後、そのモデルを使用するオブジェクト固有情報の転送と描画を繰り返すことで、同じモデルを共有するオブジェクトの描画を効率化できるわけだ。


ただ、現段階では「不透明オブジェクトを属性や事情などおかまいなしに、可視状態で視界に入れば描画する」という状態なので、半透明やゲーム中のオブジェクト事情を踏まえた諸々をやるとなればもう一工夫いるわな。