(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


プログラム変更後の待ち時間(コンパイル、ドメインリロード)を短縮する9つの方法【Unity】【最適化】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2020.3.25f1


はじめに

Unityである程度の規模の物を作っていると問題になってくるのが、コードを変更した後の待ち時間です。

コンパイルやドメインリロードを行うため、ある程度の時間はしょうがないのですが、

あまりに長くなると開発全体の効率に悪影響を及ぼすため、適度に最適化が必要です。


と言うことで今回は主に以下の記事を参考にプログラム変更後の待ち時間を短縮する方法のご紹介です!



ちなみにこの記事によると、ちゃんと最適化をすれば

ほとんどのプロジェクトは5秒でリロード出来るようになるそうです……!

Most projects should be able to achieve a 5 second reload time, almost regardless of overall size.

DeepL翻訳
ほとんどのプロジェクトでは、全体のサイズにほぼ関係なく、5秒のリロードタイムを実現できるはずです。



Unityのアップデート

Unityのバージョンによってはアップデートするだけで待ち時間が短縮される場合があります。

例えばUnity 2020.2ではコンパイル時間最適化関連の要素も多く含まれています。

プロジェクトの複雑度が増してくると、新しくコードに変更を加えたときのコンパイルに時間がかかるようになってきて、チームのワークフローや生産性に影響を及ぼし始めます。Unity 2020.2 に向けて、コンパイル時間を最適化するために役立つ複数の機能を設計しました。


もちろん、アップデートした後にそれまでと同じようにプロジェクトが動作する保証は無いので、

アップデート後の対応作業は必要になるかもしれない点には注意が必要です。


Directory Monitoring

Unityはプロジェクト内のファイルが増えるほど、変更をチェックする時間が長くなりますが、

そのチェック時間を高速(ほぼ0)にするDirectory Monitoringという機能があります。

(※Windows限定の機能)


設定方法はEdit/Preferencesにある

f:id:kan_kikuchi:20220211073737p:plain


GeneralのDirectory Monitoringにチェックを入れるだけ。

f:id:kan_kikuchi:20220211073746p:plain


Assembly Definition Files

Assembly Definition Filesを使えばコンパイルする範囲を設定し、

狭い範囲のみコンパイルするようにして時間を短縮する事が出来ます。


詳しくは以前書いた以下の記事をご参照の事。



なお、どのアセンブリのコンパイルに時間がかかっているのかを測定するには

Compilation Time Visualizerがオススメです。

f:id:kan_kikuchi:20220105073628g:plain



大きなデータをシリアライズ可能にしない

Unityはコンパイル後のドメインリロード時にシリアライズ可能なオブジェクトをシリアル化するため

大きなデータをシリアライズ可能にするのは出来るだけ避けましょう。


なお、ドメインリロードの計測にはEditor Iteration Profilerがオススメです。

f:id:kan_kikuchi:20220110073626j:plain




OnAfterDeserialize, OnBeforeSerialize, ExecuteInEditModeの乱用を避ける

OnAfterDeserializeOnBeforeSerializeExecuteInEditMode(が設定されているクラスのAwake)は

シリアル化時(≒ドメインリロード時)に実行されるため乱用したり、

重い処理を含めると待ち時間が増加してしまうため、これらを避けると待ち時間短縮に繋がります。


InitializeOnLoad, OnPostProcessAllAssetsの乱用も避ける

ドメインリロード後、Unityは変更されたC#ファイルのInitializeOnLoadOnPostProcessAllAssets

を実行するため、こちらも乱用したり、

重い処理を含めると待ち時間が増加してしまうため、これらを避けると待ち時間短縮に繋がります。


シーンのサイズを減らす

シーンに最初から配置されているオブジェクトやスクリプトのサイズ

を減らしたり違うシーンに分割する事でも待ち時間を短縮出来る場合があります。

ただし、アセット(画像とかモデルとか)のサイズではなく重要なのはC#クラスのサイズです。


必要のないウィンドウを閉じる

Unityの標準機能のウィンドウにしろエディタ拡張のウィンドウにしろ

開いてる物はドメインリロード時にシリアル化されたりコンストラクタを実行されたりするので、

使わない物は出来るだけ閉じると待ち時間短縮に繋がります。

またウィンドウのコンストラクタの処理やUIの描画を軽くする(減らす)事も効果があります。


Unityの再起動

Unityは何日も起動しっぱなしにしているとドメインリロード時間が長くなる傾向があります。

なので、Unityを再起動する事で待ち時間が短縮される事があります。



また、再起動前にProjectウィンドウを右クリックしたメニューにある

Reimport Allを実行した方が良い場合もあります。

f:id:kan_kikuchi:20220213080636p:plain