つくるの大好き。

つくるのが大好きな人の記録。

Unity2018.3でのHoloLensビルドのコード最適化設定 (MasterWithLTCGビルド)

Unity2018.3.0f2が正式版として落ちてきましたので早速HoloLensアプリのビルドを試してみました。

MasterWithLTCG ビルド設定

Unityからは普通にVisual StudioのIL2CPP のUWPプロジェクトを書き出すわけですが、VSでビルド設定をReleaseに変更しようとした際に見慣れぬ設定があることに気づきました。

この "MasterWithLTCG" という設定です。
f:id:peugeot-106-s16:20181217213747j:plain

Unityのリリースノートを調べると2018.3.0b9から導入されたもののようです。

unity3d.com

そしてLTCGというのは "Link Time Code Generation" 「リンク時コード生成」の略ということがわかりました。

そしてLTCGとはなんぞやということはこちらに書かれていました。意外と古くからある機能なのですね。

Under The Hood: Link-time Code Generation | Microsoft Docs

こちらはオフィシャルなリファレンス。

/LTCG (Link-time Code Generation) | Microsoft Docs

そして "MasterWithLTCG" ビルド設定とはこのLTCGが有効とされるビルドということになります。

LTCGする意味

ここから先は調べてみてきっとそういうことだなと理解したことなので正確ではないかもしれませんw

そもそもHoloLensプロジェクトはIL2CPPのプロジェクトとして出力されていますからコードはIL(Intermediate Language)からC++コードに変換されているわけですが、Masterビルドでのビルドプロセスは下記となります。

  1. コンパイラ:各cppファイルがobjファイルに変換される。この時コードオプティマイズも行われる
  2. リンカ:各objをマージしてexeファイルとする

これがMasterWithLTCGビルドでは下記になります。

  1. コンパイラ:各cppファイルがobjファイルに変換される。この時コードオプティマイズも行われる
  2. リンカ:各obj間の関数呼び出しをインライン化する等のオプティマイズを行う。
  3. リンカ:各objをマージしてexeファイルとする

なのでMasterWithLTCGビルドの方がリンク時間が長くなるはずです。
実際に計測してみました。

Master
1>Total compilation time: 88144 milliseconds.
1>Total link time: 16372 milliseconds.

MasterWithLTCG
1>Total compilation time: 49604 milliseconds.
1>Total link time: 158050 milliseconds.

コンパイル時間が短くなっているのは謎ですがリンク時間は10倍程度長くなっていますので色々頑張っている様子が伺えます。

生成されたDLLファイルのサイズは下記の通り。 単純には言えませんがインライン展開によってマシン語レベルでコードが増えた結果かもしれません。

Master
f:id:peugeot-106-s16:20181217215859p:plain

MasterWithLTCG f:id:peugeot-106-s16:20181217215928p:plain

まとめ

Unity2018.3でHoloLensプロジェクトを出力した際に現れる"MasterWithLTCG" ビルド設定の効能について書きました。
今回は比較的シンプルなアプリケーションでテストしたため実際に高速化の恩恵を体験することはできていないのですが、最終リリースをこの設定でビルドして少しでも高速化しておくことは意味がありそうだと思いました。

調査の経緯はこちらのツイートにもスレッド化されています。