Table of Contents
Unity でゲームの地形を簡単に作れる Terrain は強力なツールですが、デフォルトの設定のまま細かい地形を作ろうとすると動作が重くなりがちです。
場合によっては Terrain における設定を見直すだけでゲームの動作が遅くなることを防げるかも知れません。
今回は実際に Terrain の設定を変更し、どの設定変更がパフォーマンスの改善に役立つか試行してみましたので、その例を紹介します。
改善するシーン例
少々の Detail を生成した Terrain と、その上に Rigidbody を持つ数百のオブジェクト(マリモ)を配置したシーンです。
Stats で詳細を表示するとドローコール数を示す Batches が約2400、FPSは60以下となっています。
オブジェクトをスクリーンに描画するためには、グラフィックス API (OpenGL や Direct3D 等) に対してドローコールが必要です。グラフィックス API はドローコールごとに非常に多くの処理をするため、ドローコールは高負荷で、CPU 側のパフォーマンスオーバーヘッドの原因になります。
ドローコールバッチング – Unity マニュアル
このシーンの地形である Terrain の設定は以下のようになっています。
Terrain Settings の各項目の詳細はマニュアルを御覧ください。
Editorでは問題なく動作しますが、WebGLで出力すると少しカクつきが生じます。
改善するTerrainの設定項目
実際に値を変えてみて負荷が軽減された項目についてです。
Pixel Error
“Basic Terrain”タブの項目のひとつである”Pixel Error“はマッピングの精度設定です。ドキュメントでも、値が大きくなるとレンダリングにはやさしくなると記述があります。
ハイトマップ、テクスチャなどの Terrain マップと生成された Terrain との間のマッピングの精度です。値が大きいほど精度は低くなりますが、レンダリングのオーバーヘッドは減少します。
初期値は 5 です。これを10倍の 50 に変更してみます。
設定変更後のシーンと Stats です。上記のシーン画像と比べるとわかりますが、確かに地形に歪みが生じます。
細かい違いが明確ではない遠くにある Terrain や、地形形状がゲームに重要でない場合などではこの精度を下げてしまっても大丈夫だと思います。
この例では Batches が300ほど低下しました。
Cast Shadows
地形が影を落とすかどうか決める項目が”Basic Terrain”の”Cast Shadows“です。これをOffに設定すると、地形による影が非表示となります。
“Pixel Error”を変化させたシーンで影を切った状態です。少しですがドローコールの低下が確認できます。
影による表現が重要でない場合は切ると多少軽量化につながるかも知れません。
Detail Density
“Tree and Detail Objects“のタブにある項目です。Terrain に追加した草原などの Detail の描画密度を変更できます。密度を下げると描画数が減り、パフォーマンスの改善に繋がります。
この値を 1 から 0.2 まで下げてみると、細い草はスカスカになりますが、Batches はさらに100ほど低下しました。
Detail の多いシーンでは有効な改善項目と言えるでしょう。
Detail Resolution Per Patch
一度のパッチで描画されるセル数を指定できます。値が大きいほど描画処理は軽くなります。
8 から最大値の 128 に変更してみると Batches が半分以下になり、大幅に減少しました。FPSも安定的に高い値を示しています。このシーンでは見た目もあまり変わらないので非常に有効です。
終わりに
実際に試した項目は以上になります。
これら以外にも、地形を作り始める前に”Mesh Resolutions“や”Texture Resolutions“の設定を必要最低限にしておくことでパフォーマンスの改善が期待できます。これらの項目の設定変化は、すでに作った地形がリセットされてしまうことがあるので予め行う必要があります。
以上、Terrain の設定変更で描画処理を改善・軽量化する実例でした。