LessonEX 軽量化テクニック集
EX-1 このページについて
ゲームの軽量化(最適化)についてのテクニックをまとめています。それぞれの項目に繋がりはありません。必要な情報だけ見てください。
※ 随時更新します。
まずは基礎的なところですが…
・コアからURPに切り替える
→プロジェクト作成時に選択できるコアとURPですが、URPの方が描画処理が最適化されており描画速度が上がっています。基本的にはURPでプロジェクトを作るようにしましょう。
(3D脱出ゲーム編1-1も参照してください)
・オクルージョンカリングを設定する
→他のオブジェクトで隠れて見えない部分の描画を行わないようにする設定です。設定方法は3D脱出ゲーム編1-6を参照してください。
・ライトや影を多用しない
→リアルタイムライティングやシャドウの処理は負荷が高いため、多用しないようにしましょう。
・カメラを多用しない
→カメラを複数設置することで様々な表現をすることができますが、カメラの数だけ描画処理が行われることになるため、こちらも多用しないようにしましょう。使わないサブカメラは非アクティブにすることで描画負荷を抑えられます。
・使わないStart関数やUpdate関数は削除する
→スクリプトを作った際に最初から用意されている関数ですが、中身が空であってもStart関数やUpdate関数は呼ばれます。1つ1つの負荷は小さいですが、使わない場合は削除しておきましょう。

・カメラの近平面(Near)と遠平面(Far)を設定する
→ゲームプログラミングでも解説した通り、Cameraコンポーネントにはカメラに表示する最低距離と最大距離を指定するパラメータがあります。近平面を遠く、遠平面を近くすることで描画範囲が狭くなり、ゲームの軽量化が期待できます。


まずは上記のような簡単な部分から見直してみてください。
この先のレッスンでは、その他の軽量化機能について解説していきます。
Unityに慣れていない間は負荷のことは気にしなくても良いですが、慣れてきたら最適化を意識するようにしましょう。小さな負荷でも積み重なると目に見える範囲で影響が出ます。せっかく良いゲームでも、負荷がかかることで爽快感が削がれてしまっては勿体ないですね。
また、ゲームを遊ぶ人の媒体も様々です。特にモバイルゲームでは古い端末でも遊べるように、負荷にはより一層気を遣うようにしましょう。最適化をすることで発熱やバッテリーの消費も抑えられます。
「ゲームが動くならいいでしょ!」と思うかもしれませんが、遊ぶ人のことを考えてパフォーマンスの改善を図るようにしてみてください。
Unity Tips!

EX-2 プロファイラー
Unityにはどの処理で負荷がかかっているか分析することができるProfiler(プロファイラー)という機能があります。「なぜかわからないけどゲームが重たい…」という時にはまず確認してみましょう。
プロファイラーには様々な機能がありますが、ここでは基本的な使い方だけ紹介します。
「Window」→「Analysis」→「Profiler」を選択してください(Ctrl+7でショートカット)

ゲームを実行するとプロファイラーにグラフが表示されます。
このグラフはゲームを実行する際に「どの処理にどの程度時間がかかったか」を視覚的に示したものになります。

形式をTimeLineからHierarchyに変更することで、具体的にどういった処理で負荷がかかっているか確認できます。
EditorLoopは名前の通りエディターの負荷なので、あまり気にしなくても構いません。注目するべきはメインの処理(Updateなど)を行っているPlayerLoopです。

例えば100体のユニティちゃんを描画しているシーンでは「MeshRendererFinalizeUpdate」や「SkinnedMeshFinalizeUpdate」で負荷がかかっていることを確認できます。大量のメッシュを配置していることが原因です。


プロファイラーで負荷がかかっている場所が わかったら、原因に合わせて最適化を行いましょう。
EX-3 スプライトアトラス
スプライトアトラスは複数のスプライトを1つにまとめて1枚のテクスチャにする機能です。
画像を描画する際にはGPU(絵描きさん)に使用する画像を送る必要があります。
しかし、様々な種類の画像を同時に描画する際に1枚1枚スプライトを送ると、GPUに負荷がかかってしまいます。様々なスプライトを1枚にまとめてからGPUに送信することで、描画負荷の軽減を行うことができるのです。

この機能が特に有効なのは「様々な種類のスプライトを大量に表示するようなゲーム」です。しかし、該当しないようなゲームでも軽量化に貢献する可能性があります。
まずはスプライトをいくつか用意してください。今回は2Dランゲーム編で使用しているユニティちゃんの画像を使います。

まずはスプライトアトラス適用前の状態を確認しましょう。
サンプルではユニティちゃんの異なる画像を10種類表示しました。

ゲームを実行して、ゲームビュー右上の「Stats」ボタンをクリックしてみてください。
Batchsの値が11になっていると思います。これは「この画面を描画するためにGPUに11回情報を送っているよ」といった意味です(Batchsについては3D脱出ゲーム編1-6参照)

現在は10種類の画像とカメラで11回描画されていますが、10種類の画像を一括して送るようにしてみましょう。
「Create」→「2D」→「Sprite Atlas」を選択して追加してください。

スプライトアトラスが作成されるので、わかりやすいように名前をつけておいてください。
今回はユニティちゃんの画像をまとめるためUnityChanとしています。

スプライトアトラスの対象にする画像を設定しましょう。
スプライトアトラスを選択して、インスペクター右下のプラスボタンを押してください。

対象の画像が入っているフォルダを選択してください。
(個別で画像を指定することもできますが、フォルダごと一括で選択すると楽です)

選択できたら、右下の「Pack Preview」ボタンをクリックしてみましょう。

ユニティちゃんの画像が1枚のテクスチャにまとめられている様子が確認できると思います。
これがスプライトアトラスです。

スプライトアトラスのPackingの項目では、画像をどのように並べるか設定することができます。表示がおかしい時は設定を変更してみましょう。
・Allow Rotation … スプライトを回転して詰め込むようになります。
回転することで画像の密度を高め、より多くの画像をまとめられます。
注意点としてUIとして使う画像の場合はチェックを外すようにしてください。
・Tight Packing … スプライトの輪郭を使って画像を詰め込むようになります。
・Padding … スプライト間のピクセル数です。
スプライトアトラスを使った際に、隣の画像の端が映ってしまう現象が起きるこ
とがありますが、その場合はこの値を調整してみてください。

スプライトアトラスを設定した状態でゲームを実行して、Statusを確認してみましょう。
先ほどは11だったBatchsが2になっています。10種類あったスプライトを1枚にまとめたため、スプライトアトラス1回とカメラ1回を合わせて2回に抑えることができました。

このようにスプライトアトラスを用いることで画像をまとめて軽量化することができます。
特にスプライトの描画負荷を改善したい時にはぜひ使ってみましょう。