Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 C++ Hot Reloadプラグインを使ってみる

今回も前回同じプラグイン関連の記事となります。

個人的に以前から少し気になっていたプラグインがあったので、検証してみました。

f:id:alwei:20200830113051p:plain

www.unrealengine.com

このプラグインUE4標準のC++をホットリロードする機能とは別にホットリロードの機能を提供するプラグインです。

説明だけを読むと、とても素晴らしいことが書いているので気になっていました。以下は英語の説明。

Ultra-fast reload of source code no matter how big is your project, C++ Hot Reload only reloads your modified files creating micro-dlls, which allow you to change the whole class structure of your header files and see the changes reflected in your BPs and Editor properties in seconds.

Stop wasting time doing full builds, using LiveCoding or thinking in buy a new machine. Check out the reviews of developers that are using this plugin. Whatever the doubt; visit Discord, you will not regret to buying this plugin.

標準のホットリロードや、Liveコーディングよりも高速でかつ、すべてをリロードし、大幅にビルド時間を短縮してくれるそうです。「このプラグインを購入することは後悔しません」とまで書かれています。

そこまで言うのなら検証してみようということで早速マケプレで購入して検証してみました。値段が非常に高いプラグインなので、購入を迷っている人に少しでも参考になればと思います。

導入の仕方

特殊な導入方法はありません。プラグインを購入し、エンジンにインストールしてからプラグイン設定でプラグインをオンにしてからエディターを落とし、Visual Studioから起動仕直します。Visual Studioさえ入っていれば、テキストエディター自体はVisual Studioを使う必要はありません。

f:id:alwei:20200830114103p:plain

ちなみに、C++ Hot Reloadプラグインは4.23、4.24、4.25に対応しており、今回は4.25.3を使って検証しています。

プロジェクトで検証

今回は2つのC++プロジェクトで検証を行いました。1つ目はおなじみのサードパーソンテンプレートのC++プロジェクトです。2つ目はEpic Gamesのアセットでも割りとしっかりゲームとして作られているActionRPGプロジェクトです。

前者は最低限のC++プロジェクトとして、後者は少し規模の大きいC++プロジェクトとして検証してみました。ちなみにC++ Hot Reloadプラグインはプロジェクトの規模に関係なく、安定した高速リロードが可能と宣言しています。

今回検証したPCはデスクトップPCで、ハイエンドとは言わないまでもそこそこ高性能なPCです。C++ビルドに関わりそうな部分だけを記載すると以下のスペックです。

CPU : Core i7-6700K 4Ghz 4コア/8スレッド
ストレージ : Sumsung SSD 960 EVO 1TB NVMe M.2
RAM : 32GB DDR4-2132

サードパーソンテンプレートはThirdPersonCharacterのC++クラス、ActionRPGではRPGCharacterBaseのC++クラスを書き換えて検証しています。検証は標準Hot Reload、標準Live++、C++ Hot Reloadプラグインに分けて検証しています。

標準Hot Reloadと標準Live++の違いについては以下の記事が参考になります。
qiita.com

検証した結果をExcelに貼り付けてみました。同じ内容で最低3回実行しつつ、初回でキャッシュがなく異様に時間がかかっていたケースは省きました。

それでは結果をみてみましょう!

f:id:alwei:20200830115555p:plain

ふむふむなるほど。

標準Live++はヘッダークラス構成変更に対応していないため、今回の検証には入っていません。その上で俯瞰してみてみると…

標準Live++はさすがというか、cppファイル書き換えのみですが、全てのケースで最速でした。標準Hot Reloadもかなり健闘しています。標準Hot ReloadとC++ Hot Reloadのcppファイル書き換えはほぼ誤差の範囲と言えるでしょう。

問題はhファイルのクラス構成変更です。TPテンプレートとActionRPGでは、結果が逆転しています。TPテンプレートではC++ Hot Reloadが3倍近く速く、逆にActionRPGでは標準Hot Reloadが2倍以上速かったです。

これはなかなか納得がいかない結果になったので、原因を更に調べてみました。

IWYU準拠か否か

調べていくと、どうやらUE4.15辺りで導入された、IWYU(Include-What-You-Use)に準拠しているコードか、そうでないかで大きく差が出たようです。

そもそもIWYUとは何か?公式ドキュメントがあります。

docs.unrealengine.com

nclude-What-You-Use (IWYU) は、その名前が示すように、エンジンのソース コードにはコンパイルに必要な依存関係のみが含まれることを意味します。IWYU の目的は、「Engine.h」や「UnrealEd.h」のようなモノリシック ヘッダ ファイルを含まないようにすることで、不要な依存関係を削除することです。

つまり、必要な依存関係以外のインクルードが含まれないようにコードを書くという当たり前の話なわけですが、UE4にはUnityビルドシステムやPCH(プリコンパイルヘッダー)を利用して最適化を行っている部分が多く、これらの問題が隠れてしまうことが多いです。

historia.co.jp

C++ Hot Reloadプラグインでは、これらを一時的にオフにし、コードを修復してくださいという注意書きが書かれています。

C++ Hot Reload:CppHot Reload:Code Plugins - UE4 マーケットプレイス

How do I heal my source code?
Navigate and edit: Editor.Target.cs:
bUseUnityBuild = false;
bUsePCHFiles = false; (optional)
Re-activate those options afterwards is you desire so.

というわけで結論として、TPテンプレートはデフォルトでIWYUが設定されており、依存関係がほぼないように保たれていますが、ActionRPGはIWYUが設定されておらず、旧式のビルドフローを利用していることからこのような差が生まれてしまっているようです。

現在のUE4では新規プロジェクトを作成すると、IWYUを強制するようになっているため新規作成した場合にはこのような問題がありませんが、古くからあるプロジェクトではこのようなものが多いようです。とは言えEpic Gamesの提供するサンプルでもかなり新しいものであるActionRPGがIWYU準拠ではないというのは少し意外でした。

このような問題を少しでも軽減するために、Epic Games自身が提供する"IncludeTool"というものが提供されています。

docs.unrealengine.com

ただしこのツールは完璧ではなく、ほとんどの場合において完璧な変換が行われることがないようで、手動での修正がほぼ必要のようです。あくまでも修正のための出発点を作るツールということですね。

C++ Hot Reloadを実際に使ってみた

というわけでビルド速度が速くなるには条件付きにはなりますがが、C++ Hot Reloadのよいところは標準Hot Reloadと標準Live++のいいとこ取りができるということです。

標準Hot ReloadはPIE(ゲームプレイ)時にホットリロードができません。これは標準Live++では可能です。が、標準Live++ではヘッダーのクラス構成変更はできません。フルリロードのためにはエディターの再起動が必要です。

C++ Hot Reloadはどちらも可能です。しかもファイルを保存するたびに完全自動でホットリロードを行ない、気付かないうちにリロードが完了していることもあり、これは非常に便利だと感じました。

まとめ

それでは最後にそれぞれについてを総括としてまとめです。

標準Hot Reload

何もしなくても使える。cppもhもホットリロード可能。ホットリロードはモジュール単位で行われるのでモジュールの規模が大きくなると、リロード時間が非常に遅くなる。ヘッダーのクラス構成変更をしてからホットリロードすると結構な頻度でクラッシュする。

標準Live++

ホットリロード速度が最速。単体でみればどれよりも速い。PIE中でも問題なくリロード。しかしヘッダーのクラス構成変更に対応していない。変更の際にはエディターを落とし、ビルド仕直してから再起動が必要。

C++ Hot Reload

標準の2つのいいとこ取り。どのタイミングでもホットリロード可能。ファイルを保存すると自動でリロードしてくれる。IWYU準拠なコードであればモジュールが大きくなっても数秒でヘッダーのクラス構成変更でもリロードができる。たまにクラッシュする。


というわけで、C++ Hot Reloadプラグインは値段分(約18000円)の価値があるか?と言われると個人的には十分あると考えます。IWYU準拠なコードであればおそらくどのタイプのコードでも数秒から長くても数十秒でリロードができます。たまにクラッシュすることはありますが、これは標準Hot Reloadでもよく起きるので、それよりはマシかな?といったところです。

高速にC++でコーディングしながら動作確認したい!という人にはきっと価値のあるプラグインのはず。