[Unity]Terrainのせいでゲームの動作が重い?設定で改善・軽量化する実例

2021年3月1日

Unity でゲームの地形を簡単に作れる Terrain は強力なツールですが、デフォルトの設定のまま細かい地形を作ろうとすると動作が重くなりがちです。

いくつかの設定を見直すことで、動作が遅くなることを防げるかも知れません。実際に Terrain の設定を変更し、どの設定変更がパフォーマンスの改善に役立つか試行してみましたので、その例を紹介します。

改善するシーン例

少々の Detail を生成した Terrain と、その上に Rigidbody を持つ数百のオブジェクト(マリモ)を配置したシーンです。

Terrainの設定を改善する前のサンプルシーン

Stats で詳細を表示するとドローコール数を示す Batches が約2400、FPSは60以下となっています。

オブジェクトをスクリーンに描画するためには、グラフィックス API (OpenGL や Direct3D 等) に対してドローコールが必要です。グラフィックス API はドローコールごとに非常に多くの処理をするため、ドローコールは高負荷で、CPU 側のパフォーマンスオーバーヘッドの原因になります。
ドローコールバッチング – Unity マニュアル

このシーンの地形である Terrain の設定は以下のようになっています。

動作を改善する前のTerrainの設定

Terrain Settings の各項目の詳細はマニュアルを御覧ください。

Editorでは問題なく動作しますが、WebGLで出力すると少しカクつきが生じます。

改善するTerrainの設定項目

実際に値を変えてみて負荷が軽減された項目についてです。

Pixel Error

“Basic Terrain”タブの項目のひとつである”Pixel Error“はマッピングの精度設定です。ドキュメントでも、値が大きくなるとレンダリングにはやさしくなると記述があります。

ハイトマップ、テクスチャなどの Terrain マップと生成された Terrain との間のマッピングの精度です。値が大きいほど精度は低くなりますが、レンダリングのオーバーヘッドは減少します。

初期値は 5 です。これを10倍の 50 に変更してみます。

TerrainのPixelErrorの値を十倍にした後の地形

設定変更後のシーンと Stats です。上記のシーン画像と比べるとわかりますが、確かに地形に歪みが生じます。地形形状がゲームに重要でない場合は精度を下げてしまっても大丈夫だと思います。

Batches は300ほど低下しました。

Cast Shadows

地形が影を落とすかどうか決める項目が”Basic Terrain”の”Cast Shadows“です。これをOffに設定すると、地形による影が非表示となります。

TerrainでCastShadowsをOffにして影を無効化したシーン

“Pixel Error”を変化させたシーンで影を切った状態です。少しですがドローコールの低下が確認できます。影による表現が重要でない場合は切ると多少軽量化につながるかも知れません。

Detail Density

Tree and Detail Objects“のタブにある項目です。Terrain に追加した草原などの Detail の描画密度を変更できます。密度を下げると描画数が減り、パフォーマンスの改善に繋がります。

TerrainのDetailDensityを低下させたシーン

この値を 1 から 0.2 まで下げてみると、細い草はスカスカになりますが、Batches はさらに100ほど低下しました。Detail の多いシーンでは有効な改善項目と言えるでしょう。

Detail Resolution Per Patch

一度のパッチで描画されるセル数を指定できます。値が大きいほど描画処理は軽くなります。

Terrainの"Detail Resolution Per Patch"を最大にしたシーン

8 から最大値の 128 に変更してみると Batches が半分以下になり、大幅に減少しました。FPSも安定的に高い値を示しています。このシーンでは見た目もあまり変わらないので非常に有効です。

終わりに

実際に試した項目は以上になります。

これら以外にも、地形を作り始める前に”Mesh Resolutions“や”Texture Resolutions“の設定を必要最低限にしておくことでパフォーマンスの改善が期待できます。これらの項目の設定変化は、すでに作った地形がリセットされてしまうことがあるので、予め行う必要があります。

以上、Terrain の設定変更で描画処理を改善・軽量化する実例でした。

例として使用したシーンはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です