ue5」タグアーカイブ

UE5 Intel N100 1台だけでも分散ビルドの効果はあるかどうか

Unreal Engine を使った開発ではビルドに時間がかかります。特にソースコード版のエンジンを使うとエンジン全体のコンパイルも同時に行われる場合があり、1時間近く待たされることも少なくありません。

時間がかかるコンパイルを複数台の PC を使って高速化する仕組みが分散ビルドです。UE5 5.4 ではエンジンの機能として分散ビルドツール UnrealBuildAccelerator (UBA) が付属するようになりました。

前回の記事で UE5 の分散ビルド UBA を使うとビルドを大幅に高速化できることがわかりました。ですが家に PC が何台もあるケースはそんなに多くないと思われます。そこで非力な PC 1台との組み合わせでも、分散ビルドを行う意味があるのかどうか調べてみました。

Intel N100 (Alder Lake-N) の場合

以下は開発用 PC に Intel N100 搭載 PC を組み合わせて分散ビルドを行った結果です。(Intel N100 の性能について詳しくはこちら)

CPUARCHCore数Thread数単独でのビルド時間分散ビルド利用時削減時間
Ryzen 5 3600Zen261291m 28s74m 46s-16分42秒
Core i7-13700RaptorLake162448m 00s44m 37s-3分23秒
↑UE5 5.4.2 の Win64 Development Editor の C++ コンパイル時間の比較

Ryzen 5 3600 単独でビルドを行うと 91分かかりますが、N100 との分散ビルドで約 17分短縮できることがわかりました。思ったよりも効果が出ています。

流石に性能が高い Core i7-13700 の場合は 3分少々しか変わりませんが、それでもきちんと速くなっています。

分散ビルドでは通信のオーバーヘッドがありますし、非力な PC の完了待ちで逆に遅くなる可能性も考えられます。ですがこの結果を見ると少ないながら速度が向上しているため、安心して分散化できそうです。なお HordeServer も同じ N100 PC 上で走らせています。

さらに、他の PC との組み合わせでもビルド時間を調べてみました。

他の PC との組み合わせの結果一覧

ビルドPC組み合わせた分散PC合計Core数合計Thread数ビルド時間削減時間
Ryzen 5 3600なし61291m 28s
Ryzen 5 3600Core i5-1030NG7102077m 37s-13分51秒
Ryzen 5 3600Intel N100101674m 46s-16分42秒
Ryzen 5 3600Core i7-4790K102061m 40s-29分48秒
Ryzen 5 3600Ryzen 5 2600122457m 24s-34分04秒
Ryzen 5 3600Ryzen 5 5560U122456m 55s-34分33秒
Ryzen 5 3600Core i7-13700223634m 17s-57分11秒
Core i7-13700なし162448m 00s
Core i7-13700Inte N100202844m 37s-3分23秒
Core i7-13700Core i7-1030NG7203244m 20s-3分40秒
Core i7-13700Core i7-4790K203239m 29s-8分31秒
Core i7-13700Ryzen 5 2600223637m 38s-10分22秒
Core i7-13700Ryzen 5 5560U223637m 26s-10分34秒
Core i7-13700Ryzen 5 3600223633m 32s-14分28秒
↑UE5 5.4.2 の Win64 Development Editor の C++ コンパイル時間の比較

結果から、分散ビルドに使えるマシンが 1台だけ (合計 2台) でもエンジンのビルドではそれなりに効果があることがわかります。UE5 の開発で頻繁にエンジンビルドが走る場合は、空いている PC を使って UBA を入れておくと良さそうです。詳しい導入手順については前回の解説記事をご覧ください。

開発に使っている PC の性能が低い方が恩恵は多いのですが、Ryzen 5 3600 と Core i7-13700 の組み合わせ結果を見ると、どちらでビルドを開始してもビルド時間がほぼ変わりませんでした。このケースではかなり効率よく分散できていることがわかります。

台数でカバーする

使える CPU コア数が多い方がビルドは速くなっています。以下の表は、性能が高い PC 1台使った場合と、非力&古い PC を多数組み合わせた場合を比較したものです。

ビルドPC組み合わせた分散PC合計CORE数合計THread数ビルド時間削減時間
Ryzen 5 3600Core i7-13700223634m 17s-57分11秒
Ryzen 5 3600N100+1030NG7+2600+4790K+6700K285236m 23s-55分05秒
↑UE5 5.4.2 の Win64 Development Editor の C++ コンパイル時間の比較

使用した PC は Intel N100、Core i5-1030NG7、Ryzen 5 2600、Core i7-4790K、Core i7-6700K の 5台です。コア数が少ないものだけ選んでいますが、非力な PC でも数を集めることで、おおよそ Core i7-13700 1台分くらいの性能を出すことができていることがわかります。

速い PC の中に N100 を入れた場合

今度は速い PC 複数台でかなり高速に分散ビルドできている状態で、N100 や Core i5-1030NG7 など性能が低い PC を追加してみます。ビルドに使った PC は Core i7-13700 です。

組み合わせた分散PC台数合計CORE合計THREADビルド時間
13700+3950X+4750G+3600+2600+5560U+4790K76211614m 37s
13700+3950X+4750G+3600+2600+5560U+4790K+N10086612014m 07s
13700+3950X+4750G+3600+2600+5560U+4790K+1030NG786612414m 26s
13700+3950X+4750G+3600+2600+5560U+4790K+1030NG7+N10097012813m 42s
↑UE5 5.4.2 の Win64 Development Editor の C++ コンパイル時間の比較

遅い PC が足を引っ張ることもなく安定して動作しました。むしろわずかながら速度が向上しているため、性能が低くてもとりあえず Agent を追加して増やしていく方針で大丈夫そうです。

使った PC のスペック一覧その他

以下はテストに使った PC のスペック詳細になります。Ryzen 5 3600, Core i7-6700K など一部電力制限をかけた状態となっていますのでご了承ください。すべて 有線 LAN を使っています。

CPUTDPARCHCORE数THREAD数RAM容量SSD
Ryzen 5 360045WZen261264GBNVMe3
Core i7-1370065WRaptorLake162464GBNVMe4
Intel N10020WAlderLake-N4416GBNVMe3
Core i5-1030NG710WIceLake4816GBNVMe3
Core i7-4790K88WHaswell4816GBSATA
Core i7-6700K60WSkyLake4832GBSATA
Ryzen 5 260065WZen1+61232GBNVMe3
Ryzen 5 5560U25WZen361232GBNVMe3
Ryzen 7 4750G65WZen281632GBNVMe3
Ryzen9 3950X105WZen2163232GBNVMe3

UnrealBuildAccelerator は PC 性能によらず分散の効果がわかりやすいので、導入のハードルがかなり下がったのではないかと思います。今回は C++ のコンパイルのみ試しましたが、ビルド時間を短縮できますので UE5 での開発効率が大きく向上しそうです。

関連エントリ

UE5 のビルドを速くする、分散ビルド UnrealBuildAccelerator を使う

UE5 5.4 には UnrealBuildAccelerator (以下 UBA) という分散ビルドツールが付属しています。家に複数台の PC がある場合は、それぞれインストールしておくとことでビルド時間を大幅に短縮することができます。

実際に空いている PC を使って UE5 のビルドがどれくらい速くなるの比較してみました。以下の表は UE5 5.4.2 Win64 Development Editor のエンジンリビルド時間の比較です

CPUARCHCoRE数THREAD数単独ビルド時間分散ビルド利用時ビルド速度
Core i7-13700RaptorLake162448m 00s15m 21s3.1 倍
Ryzen 5 3600Zen261291m 28s16m 28s5.6 倍
UE5 ビルド時間の比較、ビルド時間が短い方が高速

Core i7-13700 では 48分かかっていたビルドが分散ビルド利用時でわずか 15分。単独でビルドしていた場合の 1/3 の時間で完了しています。

コア数が少ない Ryzen 5 3600 の場合はさらに効果が大きく、ビルド速度は 5.6倍にもなります。91分から 16分まで短縮できており、スタンドアロンの場合は Core i7-13700 の倍の時間がかかっていたものが、分散ビルドを使うとほぼ同じ時間で完了しました。

今回分散ビルドで使用した PC は以下のとおりです。

CPUARCHCORE数THREAD数RAM容量
Ryzen 5 2600Zen1+61232 GB
Ryzen 5 3600Zen261264 GB
Ryzen 5 5560UZen361232 GB
Ryzen 7 4750GZen281632 GB
Ryzen 9 3950XZen2163232 GB
Core i7-13700RaptorLake162464 GB
合計58108
ビルドに使用したヘルパー (Agent) PC 一覧

全部で PC 6台、合計 58コア 108スレッド使用しています。

Core i7-13700 でビルドした場合は他の 5台がビルド用のヘルパー (Agent) になります。本体 16コア 24スレッドで、加えて外部の PC が Agent として 42コア 84スレッド分追加される形になります。同じように Ryzen 5 3600 の場合は本体 6コア 12スレッドに対して外部の PC が 52コア 96スレッドです。

非常に効果が大きかったので、PC が複数台ある場合は UBA を使うことでビルド時間をだいぶ短縮できそうです。

以下分散ビルド UBA のインストール方法の詳細です。

インストール手順

インストールにあたってこちらのページを参考にさせていただきました。UBA について詳しくはこちらのページも参照してください。

(1) HordeServer インストール

どれか 1台の PC に HordeServer をインストールします。この手順は GitHub のソースコード版エンジン UE5 5.4 のものです。

  1. UnrealHordeServer.msi を実行してインストールします
    • GitHub 版のエンジンをビルドしている場合は Engine/Extras/Horde/UnrealHordeServer.msi にあります。
    • GitHub からダウンロード直後は Extras フォルダがないので、先に Setup.bat を実行しておく必要があります。
  2. このマシンに Port 13340 でアクセスできるようにしておきます
    • Firewall で制限がかかっている場合は、TCP Port 13340 でアクセスできるように設定しておいてください

(2) HordeAgent のインストール

ビルドに使いたい PC それぞれに Agent をインストールします。HordeServer と同じマシンにインストールしても構いません。

  1. ブラウザで HordeServer をインストルした PC にアクセスします
    • 「 http://サーバーPCのIPアドレス:13340/tools 」を開きます
  2. ダウンロードページが開くので「Horde Agent (Windows Installer) 」をダウンロードします
  3. ダウンロードした UnrealHordeAgent.msi を実行してインストールします
    • 「Horde Server URL:」には「 http://サーバーPCのIPアドレス:13340」を入力します
      • 注意: サーバーが自分自身の場合でも絶対に「localhost」や「127.0.0.1」を使わないでください。ここで接続に使用したアドレスが他の PC に配布されるので、localhost だとこの Agent にアクセスできなくなります。
    • 「Sandbox directory: 」はキャッシュとして使うフォルダを指定します
      • 空き容量の多い SSD ドライブをおすすめします。問題なければそのままでも構いません。
  4. インストールが終わると、ブラウザで自動的に「Agent Enrollment」のページが開きます
    • もし開かない場合は、タスクトレイの「U」アイコン (Unreal Engine のロゴ) 右クリックから「Enroll with Server…」を選択してください
  5. しばらくすると Agent Enrollment のページに PC 名が表示されるので、選択して右上の「Enroll Agents」をクリックします
    • PC が表示されるまで時間がかかる場合があります。数分待ってみてください。
  6. 登録が終わったら、「http://サーバーPCのIPアドレス:13340/agents」を開いて PC が表示されていることを確認してください
  7. タスクトレイに UnrealEngine ロゴのアイコン (UnrealHordeAgent) が登録されているので、右クリックして Status を「When Idle」に変更します
    • Status → When Idle
  8. Agent PC に Port 7000~7010 でアクセスできるようにしておきます
    • Firewall の設定で TCP Port 7000~7010 で受信できるようにしておきます

同じ手順で各 PC にそれぞれ HordeAgent をインストールしておきます。今回のテストでは 6台の PC 全てに Agent をインストールしています。

なお VisualStudio などビルド環境のセットアップは不要です。

(3) ビルドするための設定

ビルドを行う側の PC にもさらに追加の設定が必要です。

  1. BuildConfiguration.xml を作成します
    • 特定のエンジンだけで使用する場合は、エンジンフォルダ内の Engine/Saved/UnrealBuildTool/BuildConfiguration.xml に保存します
    • もし全部のエンジンで同じ設定を使いたい場合は、自分のドキュメントフォルダの中に 「ドキュメント\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml」のように入れてください
  2. BuildConfiguration.xml の内容は以下のとおりです
    • xml 内の「サーバーPCのIPアドレス」の部分は置き換えてください。
    • すでに BuildConfiguration.xml が存在する場合は内容を追加してください。
<?xml version='1.0' encoding='utf-8'?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
    <BuildConfiguration>
        <bAllowFASTBuild>false</bAllowFASTBuild>
        <bAllowUBAExecutor>true</bAllowUBAExecutor>
    </BuildConfiguration>
    <Horde>
        <Server>http://サーバーPCのIPアドレス:13340</Server>
        <WindowsPool>Win-UE5</WindowsPool>
    </Horde>
    <UnrealBuildAccelerator>
        <bLaunchVisualizer>false</bLaunchVisualizer>
        <bForceBuildAllRemote>false</bForceBuildAllRemote>
    </UnrealBuildAccelerator>
</Configuration>

これで完了です。この設定をした PC 上で UE5 の C++ ビルドを行うと分散ビルドが行われます。

ビルドを行う場合の注意点

ステータス切り替えについて

HordeAgent には PC の Idle 状態かどうか判定して Status を動的に切り替える機能があります。

ですが負荷の高い作業やゲームのテストプレイ、負荷の調査などを行う場合は、意図しないビルドタスクが割り当てられてしまわないように予め手動でステータスを切り替えておくことをおすすめします。

  1. タスクトレイの「U」(UnrealEngine ロゴ)アイコン右クリック → Status
  2. 普段は「 When Idle 」にしておく
  3. テストプレイ前に「 Disabled 」に切り替え、終わったら「When Idle」に戻す

Horde Agent の設定変更

サーバーの URL やキャッシュフォルダなど、インストール時に入力したパラメータをあとから UI 上で変更する方法が見つかりませんでした。変更したい場合は、もう一度インストーラーを実行し直すのが確実なようです。

Windows 10 を使って Intel CPU でゲーム開発をしてはいけない理由

近年の Intel CPU はスマートフォンや Apple と同じような非対称な CPU Core を採用しています。高性能コアと呼ばれる P-Core と、高効率(低消費電力)コアである E-Core の組み合わせです。この非対称な構造は Core i の第 12 世代 (Alder Lake) から用いられており、Core i9 で比較すると以下のようになります。

CPU P-CoreE-Core合計コア数合計スレッド数
2021年Core i9-12900KAlderLake881624
2022年Core i9-13900KRaptorLake8162432
2023年Core i9-14900KRaptorLake Refresh8162432

P-Core はシングルスレッド性能が高く HT に対応しているものの消費電力が高く強力な冷却が必要になります。E-Core はピーク性能が低い代わりにコンパクトでより多くの Core を搭載できます。

Windows 10 が問題なのは、OS のスケジューラーがこの非対称な CPU コアの性能を引き出すことができずに著しく性能が落ちてしまう場合があるからです。

実際に Core i7-13700 を使用して Windwos 10 で UnrealEngine 5 のビルド時間を測定してみます。Core i7-13700 は Core i9-12900K 同様 8P + 8E の 16コア、24スレッドの CPU です。

CPUCoreCore数Thread数RAMSSDビルド時間比較
Core i7-13700RaptorLake162464GBNVMe 480分32秒↑遅い
Ryzen 5 3600Zen261232GBNVMe 377分46秒
Core i7-11700KRocketLake81632GBSATA68分46秒
Ryzen 9 3950XZen2163264GBNVMe 436分03秒↓速い
  • VisualStudio 2019、 UE5 5.1.1 の Development Editor をビルドしたときの時間の比較
  • ビルドにかかった時間が短い方が高速

ビルド時間で旧世代の CPU 「Core i7-11700K」に敵いません。Core i7-13700 は K 無し (65W) モデルということもありますが、同じ 65W でコア数が半分以下の CPU 「Ryzen 5 3600」にも負けていることがわかると思います。

Core i7-13700 のビルド速度が予想以上に遅くなっている原因はタスクマネージャーを見るとすぐに分かります。下はビルド中のタスクマネージャーをキャプチャしたものです。

↑ 本来 24スレッドあるはずなのに 1/3 の 8スレッドしか稼働していません。しかもこの 8 スレッドはちょうど E-Core の 8個分に相当します。

UnrealBuildTool (UBT) は 8 コアにしか割り当てられていないことを知らないため、本来の 24 スレッドと認識しています。ビルド中は 14 個ものコンパイラが起動しており、これがすべて E-Core 8個に押し込められてしまうわけです。

そこで、UEFI (BIOS) で E-Core を無効化して P-Core だけを使ってビルドしてみることにします。以下の表にその結果を載せています。E-Core を無効化するだけで 55分まで短縮されました。ビルドが 25分も早く終わります。

CPU コア数スレッド数RAMSSDビルド時間比較
Core i7-13700無変更162464GBNVMe 480分32秒↑遅い
Core i7-13700E-Core 無効化81664GBNVMe 455分43秒↓速い

原因と回避方法など

ビルド中のタスクマネージャーを見ると、コンパイラは「基本優先度」が「通常以下」(BelowNormal) の状態で走っていることがわかります。

Windows 10 のスケジューラはおそらく、優先度が「通常」(Normal) より低い場合に E-Core に割り当てる仕組みになっているものと思われます。実際に UE5 5.1.1 の UnrealBuildTool の設定値を書き換えて、プロセスの優先度を Normal まで上げるときちんと全部の CPU Core にタスクが割り振られるようになりました。

UnrealBuildTool だけでなく、同じ問題は他のツールでも発生します。例えばシェーダーのコンパイル (ShaderCompileWorker) も同様で、負荷が E-Core のみに集中することがわかっています。

この問題は Windows 11 を使うことで解決します。

WIndows 11 では低プライオリティのタスクが E-Core だけに割り当てられてしまうことが無く、優先度が「通常以下」(BelowNormal) の場合でもすべてのコアを使用してビルドを行います。ビルド速度の比較表に Windows 11 での結果を加えてみました。

CPU コア数スレッド数RAMSSDビルド時間比較
Core i7-13700Windows 10 無変更162464GBNVMe 480分32秒↑遅い
Core i7-13700Windows 10 E-Core 無効化81664GBNVMe 455分43秒
Core i7-13700Windows 11 無変更162464GBNVMe44分55秒↓速い

↑ Windows 11 にアップグレードするだけでビルド時間を 35分も短縮することができました。

タスクマネージャーでもきちんとすべてのコア、24スレッドが使われています。

なお、UE5 5.2 からは UnrealEngine 側でもこれらの対応が行われています。UnrealBuildTool (UBT) の ParallelExecutor 利用時は以下のように、CPU が非対称コアを搭載している場合、優先順位を「通常以下」(BelowNormal) ではなく「通常」(Normal) に設定するようになっています。

/// The priority to set for spawned processes.
/// Valid Settings: Idle, BelowNormal, Normal, AboveNormal, High
/// Default: BelowNormal or Normal for an Asymmetrical processor as BelowNormal can cause scheduling issues.
/// </summary>
[XmlConfigFile]
private static ProcessPriorityClass ProcessPriority = Utils.IsAsymmetricalProcessor() ? ProcessPriorityClass.Normal : ProcessPriorityClass.BelowNormal;

そのため Windows 10 でも UE5 5.2 以降はエンジンのビルド時間が短縮されるようになりました。ただしこれは根本的な解決ではなく、ツール個別の対応になるため注意が必要です。もし対応していないツールが存在する場合 (他の UBT Executor や分散ビルドなど) はやはりパフォーマンスが低下してしまう可能性があります。

Core i 12000 シリーズ (第12世代, AlderLake) が出たばかりの頃はまだ Windows 10 搭載 PC も出荷されていました。せっかく新しい PC に入れ替えたのに、ビルド時間がかえって遅くなってしまうなんてことがありました。

流石に今はもう無いと思いますが、Alder Lake 以降の Intel CPU 上でゲーム開発を行う場合は Windows 11 を使用することをお勧めします。