ここからダウンロードできます。

ジオメトリの結合で動作を軽くする

3Dオブジェクトのジオメトリ(3D形状における頂点の座標群)が多いと動作が遅くなります。ひとつひとつに対してドローコールが発生するため、sceneオブジェクトに追加されているメッシュの個数が多いと動作が遅くなるのです。

解決法として、ジオメトリを結合させることでGPUに対するドローコールを減らすことができます。小さな3Dオブジェクトをひとつひとつ追加して表示するよりは、複数の三角形をまとめた巨大な3Dオブジェクトを1つだけにしたほうが負荷は少なくなるのです。

前回のOpenTKでつくった3DカーレースゲームをTypeScript/JavaScriptでもつくってみる(1)ではsceneオブジェクトに追加されたメッシュの個数が多すぎたため車1台では問題はありませんでしたが、3台に増やすと動作が重くなっていました。今回はジオメトリの結合で動作を軽くします。

ただジオメトリをまとめてしまうと、3Dオブジェクトとしては1つになるため、個別にマテリアルを設定することができなくなります。車の描画に使われている色の種類はそんなに多くないようなので、同じ色のものはひとつにまとめることにします。

同じ色のものだけジオメトリを結合する

TypeScriptで以下のような関数を作成します。

コードをWindows.Formsアプリで取得する

コードの繰り返しの部分はWindows.FormsアプリでXMLファイルから頂点座標と色を取得して作成します。

XMLファイルはこれを使います。これはOpenTKでUnityのアセットは使えるのか?で作成したものです。

GetTrianglesメソッドで三角形を取得したら使用されている色でグループ分けをします。

実際に動かしてみる

実際に動かしてみるとこんな感じになります。車の種類と数を増やしても問題なく動いています。

ここからダウンロードできます。