Unity開発を高速・快適にするためのメモ
最終更新日:2024年08月26日記事作成日:2022年02月16日
快適なUnityライフを送るためのメモです。意外といろいろあって忘れそうなのでまとめてみました。
更新履歴
(2024年8月26日)AndroidのScripts Only Buildオプションがなくなっているのを反映
(2022年3月10日)Unity 2022.1の変更点を反映
(2022年2月19日)書き忘れていた項目をいくつか追加
(2022年2月16日)とりあえずページ作成
できるだけ新しいバージョンのUnityを使う
Unityは2020.3から2021.2にかけて多数のビルド・インポートの高速化が入ってきています。テクスチャのインポートやIL2CPPが「何倍も」速くなっていたりしますので、できるだけ早く2021.2まで上げるのが個人的におすすめです(VRChatユーザーなんですけどって方は……もうしばらく耐えましょう!)。
さらにUnity 2022.1ではドメインリロードの高速化(というより2020、2021で遅くなっていたのに対処)が入ってくるようです。
M1 MacではUnity HubからApple Siliconネイティブ版のUnityをインストールできるようになっており、Intel版よりめちゃくちゃ速いです。
コンパイル・再生がなぜ遅いのか知りたい
いろいろ設定をいじったりする前に、パフォーマンスが出ない場合はまず計測を、ということで……
Editor Iteration Profiler
Editor Iteration ProfilerはUnity公式のパッケージで、コンパイル時やエディタを再生・停止したときにどのような理由で待ち時間が発生しているかを確認できます。
使用するには、Package Managerウィンドウの左上からAdd package from git URL…で https://github.com/Unity-Technologies/com.unity.editoriterationprofiler.git を入力してインストールし、Window > Analysis > Editor Iteration Profiler > Show Windowでウィンドウを開いて左上のEnableをオンにします。
ツリーの中を見ていくと、たとえば[InitializeOnLoad]のメソッドで長時間の処理が毎回実行されていた、というようなことが発見できたりします。
Import Activity
Window > Analysis > Import Activityで、インポートしたアセットや、個々のアセットのインポートにかかった時間、依存の多いアセット等を一覧表示できます。
Compilation Visualizer
Compilation Visualizer for Unityはアセンブリごとのコンパイルの所要時間をグラフィカルに表示するオープンソースソフトウェアです。
使用するには、Project Settings > Package Manager > Scoped Registriesに下記を追加してPackage ManagerのMy Registriesからインストールします。
- Name: OpenUPM
- URL: https://package.openupm.com/
- Scope(s): com.needle.compilation-visualizer
Window > Analysis > Compilation Timelineを開くとコンパイル時間のグラフが表示されます。アセンブリを選択するとアセンブリの依存関係を確認することもできます。
再生の待ち時間を短くしたい
Project Settings > Editor > Enter Play Mode Optionsをオンにしてドメインリロードとシーンリロードを無効にすると、爆速で再生開始できるようになります(Editor Iteration Profilerで表示される長時間のドメインリロードの部分が丸々消えます)。
注意点として、ドメインリロードを無効にすると、static変数やstaticイベントハンドラが初期化されません。例えば以下のようなスクリプトがあった場合、再生するたびに表示される数値が増えていってしまいます。これにより既存のコードがエラーになったり予測できない動作になってしまうことがあります。
using UnityEngine;
public class DomainReloadingTest : MonoBehaviour
{
static int count = 0;
void Awake()
{
Debug.Log(count);
count++;
}
}
対策として、static変数を使用しないようにするか、下記のようにstatic変数を初期化するコードを追加します。
using UnityEngine;
public class DomainReloadingTest : MonoBehaviour
{
static int count = 0;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void Init()
{
count = 0;
}
void Awake()
{
Debug.Log(count);
count++;
}
}
詳しくは「Unity - Manual: Domain Reloading」や下記ページを参照です。
Asset Storeのアセットやパッケージのスクリプトがドメインリロードの無効化に対応しておらず正常に動作しないことがあります。プロジェクトを作成してできるだけ早い段階からドメインリロードを無効化しておくと問題が早期に見つかるのでおすすめです。
アセットのインポート時間を短くしたい
Compress Assets on Import
PreferencesのAsset Pipeline > Compress Assets on Importをオフにすると、アセットの変換をインポート時ではなくビルド時に必要になってから実行するようになります。
デメリットとして、インスペクタでテクスチャの圧縮後のファイルサイズを確認できなくなりますので、そうした場合は一時的にオンに戻します。
Unity Acceleratorを使用する
Unity Acceleratorを使用すると、アセットの変換をPCにキャッシュして、同じアセットを2回目以降にインポートするときに変換処理を省略できます。
並列インポートを有効にする
Project Settings > Editor > Pararllel Importをオンにするとマルチスレッドでアセットのインポートができます(PreferencesではなくProject Settingsなのが謎ですが、まだ安定機能扱いでないからとかでしょうか)。
テクスチャのFast Compressorを使用する
Build SettingsのAsset Import OverridesでTexture CompressionをForce Fast Compressorにするとテクスチャのインポートが圧縮速度優先になります。リリースするときは元に戻す必要があります。
Force Uncompressedにするとそもそも圧縮を行いません。大量のアセットを手っ取り早く試したいときにインポートがとても速くなります。
ビルドを速くしたい
IL2CPPビルドを速くしたい
Unity 2021.2でIL2CPPが速くなっていますが、Build SettingsのIL2CPP Code Generationを「Faster (smaller) builds」にするとさらに倍くらい速くなります。実行速度がいくらか遅くなる(きちんと計測していませんが数割程度?)ので要注意です。
Unity 2022.1では設定がBulid Settings > Playerの中に移動しているようです。
シェーダーのコンパイルを速くしたい
ビルド時のプログレスバー表示で、一つのシェーダーで何千という数のvariantがコンパイルされている場合は、たぶん組み合わせ爆発が起きてます。「Unity シェーダーメモ」の「シェーダーのコンパイル時間を短くしたい」を参照してみてください。
それから、まだデフォルト有効ではないですが、シェーダーコンパイル自体が高速になりそうという情報。
Androidビルドを速くしたい
Development BuildでスクリプトのみをビルドするScripts Only Buildオプションがありましたが、Unity 2021.3あたりからこのオプションはなくなっていて、シーンやアセットに変更がない場合は自動的にスクリプトのみビルドするようになっています。
BuildPlayerOptionsにBuildOptions.DevelopmentとBuildOptions.BuildScriptsOnlyを指定すると強制的にスクリプトのみのビルドになります。
WebGLビルドを速くしたい
Publishing SettingsのCompression FormatがBrotliだと出力サイズがGzipの4分の3ほどになりますが、圧縮に非常に長い時間がかかります。開発中はGzipにしておいたほうがよさそうです。Decompressedにするとさらに少し速くなります(が、出力サイズは非常に大きくなります)。
「IL2CPPビルドを速くしたい」も参照してください。
ライトマップを焼くのを速くしたい
Progressive GPUに変更する、Lightmap Resolutionを下げる等すると速く焼けるようになります。詳しくは「Unity ライトマップの焼き方メモ」を参照してください。
速いPCを買う
速いPCを使うとすべてが速くなってきっと進捗も出ます。Geekbench BrowserあたりでCPUの型番を検索して、シングルコアとマルチコアのスコアを確認・比較するといいと思います。シングルコアのスコアが高いと日常的なオペレーションが、マルチコアのスコアが高いとビルドやシェーダーコンパイルが速くなります。
ノートでシングルコアとマルチコアともにデスクトップハイエンドクラスのRyzen 9 5950Xに迫る数値を叩き出しているM1 ProやM1 Max化け物……ってなります。最近は第12世代CoreのCore i9-12900Hあたりもノートで同クラスの性能になっていて熱いです。