見出し画像

[翻訳・記事紹介]Roblox開発におけるパフォーマンス最適化について Part2(パフォーマンスを意識したマップの制作)


参照元リンク:https://devforum.roblox.com/t/real-world-building-and-scripting-optimization-for-roblox/3127146

前回の記事はこちら


Part2では元記事のChapter2を紹介していきます。


  • Chpater2-マップのビルド方法 レンダリングに最適化したビルド方法

マップのビルディング方式

マップは30個ほどのゾーンに分かれており、プレイヤーは蛇行するように進んでいきます。

各ゾーンは約100x100スタッドのサイズで、壁、コインや宝物が集まる「COIN PIT」、その他の装飾があります。各ゾーンは独立して構築され、それぞれに予算が設定されています。

かなり明確ですが、このようにエリアが区切られています。

キットバッシング(既存モデルの再利用)

マップゾーンの予算は、各ゾーンごとに約40,000トライアングルと40のドローコールに設定されています。これを満たすためには、さまざまな方法で予算を使うことができますが、予算内で自由に設計することができます。

このプロジェクトでは、キットバッシングを使用しました。
キットバッシングとは、多くのメッシュパーツを組み合わせて、カスタムジオメトリを詳細に作成する代わりに、隠れた面の削除を気にせず再利用する方法です。Elden Ring、Fallout、Skyrimなどのゲームがこの技術を使って効率的に建設しています。噂によれば、Halo 1、2、3では、ゲーム全体で同じ岩のメッシュが再利用されていたと言われています。

これらの岩はかなり頻繁に再利用されています。

キットバッシングは、効率的なマップ作成のための一つの技術です。またより多くのパーツ、ユニオン、テクスチャ、デカールを使用することもできますが、これらは予算を予想以上に早く消費する傾向があることに注意してください。

ジオメトリの生成とドローコール

キットバッシングが効率的である理由は、ドローコールに関連しています。
ドローコールは複雑で、簡単に説明すると、同じメッシュIDと同じマテリアルを持つメッシュを再利用することで、エンジンがそれらを「バッチ処理」し、1つのドローコールにまとめることができます。

例えば、マップ全体で使用される木の例です。木は4つのメッシュ(トップ部分3つとトランク1つ)で構成されていますが、異なる色、回転、スケールを使用することで、全ての木を描画するのにわずか2つのドローコールしかかかりません。異なるマテリアルやユニークなメッシュIDを使用していた場合、もっと多くのドローコールが必要になり、予算がすぐに消耗してしまいます。

2ドローコール!もし自分のメッシュがワイヤーフレームモードにしたときに同じように見えるならポリゴンが多すぎるかもしれません。

予算内に抑える

一般的なスタイルとして、段ボール、布、カーペット、プラスチック、金属 などで景観を作り、高解像度のジオメトリとカラーを使用して世界を構築しています。モデルの一部にはバーテックスカラーを使って、色をより立体的に見せています(例えばサボテンの底部など)。これにより、素材の総数を低く抑え、バッチ処理を助けています。

ゾーンごとに予算が40,000トライアングル、40ドローコールに設定されています。
このゾーンは最終的に44,353トライアングルと23ドローコールで、草やコインの距離カリングを組み合わせることで、全体で23ドローコールという予算内に収まっています。

上記と同じゾーンをワイヤーフレームで見た場合

自分だけの再利用可能なパーツを作る

Robloxのパーツ(ウェッジ、ボール、ブロックなど)は内部的にはメッシュであり、カスタムメッシュと同じようにバッチ処理されます。しかし、作成できるものが限られているため、汎用の再利用可能なメッシュを自分で作成することをお勧めします。自分のカスタムメッシュも、Robloxのメッシュと同じようにバッチ処理され、迅速にレンダリングされます。

以下は、このマップで使用した一部の例です:

コーナーメッシュ: 歩道の丸みを持つ角を作成し、これを多くの場所で再利用。


フェンス: 4つのエッジにベベルを持つ再利用可能なメッシュを使用。Z軸に沿って伸ばすことができる。


ベベル付きキューブ: 主に壁の構築に使用。約80トライアングルで広範囲に使用。


コインメッシュ: 多く再利用され、バッチ処理されるため合計のポリゴン使用量のみカウントされる。

上級者向け: パートモデルをメッシュにベイク

タウンハウスはもともと多くの標準Robloxパーツ(ブロック、ウェッジなど)で作られていましたが、これをメッシュにベイクすることで、インスタンス数とドローコール数を大幅に削減しました。Roblox Studioのツールを使って、以下の手順でメッシュに変換しました:

1. 各マテリアルをユニオンに結合(例: ブリックパーツをまとめる、ガラスパーツをまとめるなど)。
2. 右クリックメニューの「Export Selection」でユニオンをメッシュとしてエクスポート。
3. メッシュパートを再インポートし、ハウスを再結合(アンカー設定と衝突設定を忘れずに)。

マップをobj形式に直接出力できます。

これらの家は元々は100以上のパーツと12のドローコールが必要でしたが、これで6つのメッシュとそれぞれのマテリアルの数のみになりました。またそれぞれの家が共通しているため、お互いにバッチ処理が適応できます。

追加のライト

ほとんどのゾーンでは、平坦なシェーディングを防ぐために、いくつかのスポットライトとポイントライトを追加しています。これによる影響は少なく、追加したライトがシャドウを生成したり動いたりしないため、コストも非常に少ないです。

 Future Lightsや影、動くオブジェクトなどは全て複雑に関連しあっており、それだけで一つの記事を書けてしまいます。
ちょっとした推奨事項としては、影を生成するライトやとても大きなライトを少なくすることです。小さなライトは影響が少ない傾向にあります。

スポットライトを加えないと、平面的でつまらない表現になってしまいます。

Chapter2の要約

  • バッチ処理を最大限に活用する: メッシュとマテリアルの組み合わせを再利用し、スケール、回転、カラーを多用する。

  • キットバッシング用のメッシュを作成する: 簡単なプリミティブが役立つ。

  • 大量のパーツで作成したモデルを、Studioを使って少数のメッシュに変換することができる

  • 追加のライトを使うことで、世界がより立体的に見える


モデリングにBlenderや他のCGソフトを使っている方は弊社も含めかなり多いかと思いますが、インポート時にこれらを無視してしまうといつの間にか多くの処理負荷を強いることになります。

Robloxの公式ドキュメントにもありますが、Packageなどを上手に活用できるとそういった状況を避けられるかもしれません。こちらもかなりボリュームのある記事になっていますが、Roblox以外でもかなり役に立つ考え方が記載されていますのでおすすめです。


Part3はこちら


いいなと思ったら応援しよう!