はじめに
最近PlayerSettings.SetIncrementalIl2CppBuildというAPIがある事に気が付きました。スクリプトリファレンスには下記のように記載されています。
Sets a boolean flag indicating a IL2CPP supported BuildTargetGroup is going to use incremental builds.
これを素直にとらえるとIL2CPPでインクリメントビルドを有効にするか否かを指定する為のAPIのようです。 早速計測してインクリメントビルドでどの程度ビルドが早くなるのか確認したいと思います。
結論
結論を先に書いておきます。
PlayerSettings.SetIncrementalIl2CppBuild
はIL2CPP のインクリメントビルドには何の影響もないデッドコードです。
計測環境
- Unity Version : Unity2020.3.18f1
- Project : LEGO Tutorial
- プラットフォーム : Android
- OS : Window10
- CPU : Core(TM) i7-10875H CPU @ 2.30GHz
- ストレージ : Samusung SSD 980PRO
計測方法
- Export Projectを有効にチェックをした状態でExportを実行
- PlayerSettings.SetIncrementalIl2CppBuild(BuildTargetGroup.Android,false)もしくはPlayerSettings.SetIncrementalIl2CppBuild(BuildTargetGroup.Android,true)を実行
- Script Only Buildにチェックを入れた状態で1と同じ出力先にExportを実行
2~3をそれぞれ3回づつ繰り返します。
結果
回数 | インクリメントビルド無効時のビルド時間 | インクリメントビルド有効時のビルド時間 |
---|---|---|
1 | 42588[msec] | 43241[msec] |
2 | 42390[msec] | 42558[msec] |
3 | 42931[msec] | 42723[msec] |
・・・・変わらないですね。(*^-^)
考察
Unity公式マニュアルのIL2CPP ビルド時間の最適化には下記のように記載されています。
インクリメントビルドの使用
インクリメントビルドを行う場合、C++ コンパイラーは、最後にコンパイルしてから変更が加えられたファイルのみを再度コンパイルします。 インクリメントビルドを行うには、(ターゲットディレクトリを削除せずに) 以前のビルドロケーションと同じ場所にプロジェクトをビルドします。
この説明を読むと、「1度ビルドして同じ出力先へさらにビルドすればインクリメントビルド」となるとは記載されていますが、PlayerSettings.SetIncrementalIl2CppBuild
に関しては一切の記載がありません。
どうやら、PlayerSettings.SetIncrementalIl2CppBuild
による指定は必要ないようです。
また、この後も色々検証してみた結果、以前のビルドロケーションと同じ場所にプロジェクトをビルドします。
の部分ですが、少なくともAndroidプラットフォームにおけるビルドには関係なさそうです。
Androidプラットフォームに対するビルドを行う場合、Tempフォルダー以下に中間ファイルが出力されますが、その中間ファイルとの差分になるようです。 よって、UnityEditorでプロジェクトを開いて1度めのビルドは必ずフルビルド。2度目以降のビルドがインクリメントビルドになります。 但し、Export Projectの値を変更すると、インクリメントビルドでは無くフルビルドになるので注意が必要です。 (Export Projectにチェックを入れてビルドした後に、チェックを外してビルドするとフルビルドとなります。) また、これはExport Projectにチェックを入れていない、つまりプロジェクト形式ではなく、APKの形式で出力する場合にもインクリメンタルビルドが有効であることを示しています。
マニュアルに書かれている「1度ビルドして同じ出力先へさらにビルドすればインクリメントビルド」ですが、恐らくiOSプラットフォームの事を指しているのだと思われます。
元々IL2CPPのインクリメントビルドはiOSのみ先行して実装されており、ビルド時のターゲットディレクトリに以前と同じロケーションを指定すると「Warning
Build folder already exists.Would you like to append or replace it?」というダイヤログが表示されていました。
この時、Append
を選択するとインクリメンタルビルドとなっていました。
その後、他のIL2CPP対応プラットフォームでもインクリメンタルビルドに対応したが、その後もマニュアルが更新されていないというのが現在の推測です。
Android以外のプラットフォームに関しは確認していませんが、もし違う結果になった場合はご連絡下さい。
情報お待ちしております。