Windows」カテゴリーアーカイブ

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 を使用することをお勧めします。

Windows 10 ファントムダスト (Phantom Dust)

Windows で懐かしいファントムダストが遊べるようになっていました。Xbox (初代) のゲームです。

03

Store: Phantom Dust

解像度が上がっていたり設定が増えていたり、様々な修正が施されているようです。

↓解像度設定

04

例えばこの辺↓も改良されています。

↓ロード中の Tips に [Enter] キー待ちが!

01

↓設定で変更可能。ロード画面のヒントを「待つ」

05

初代 Xbox 版はロード終了後に待たなかったので、Tips が表示されてもすぐに消えていました。

実は当初、開発中はステージなどの読み込みがだいぶ遅かったのです。途中でロード画面に Tips を入れようという話になりました。他の機能組み込み作業が詰まっていたので、システム最適化が後回しになっていたためです。

終盤になって時間に余裕ができてから、ようやくロード周りを高速化したのですが「読み込みが早くなったら Tips が読めないじゃないか」と何故かディレクターに怒られたのをよく覚えています。

VisualStudio MSBuild の解説。Makefile と書き方の比較など

VisualStudio の Build tool 、MSBuild の解説を書きました。
make の機能と比較しながら、シンボル定義、Task の実行、Target の依存関係の記述その他に触れています。

Hyperでんち: Visual Studio (MSBuild) 続きはこちら

VisualStudio の vcxproj などで共通の設定を Import しておけば、シンボルの設定や Custom の Build 手順などをプロジェクト間で共有することができます。

関連エントリ
VisualStudio と C++11 、コンパイラの違いなど
fastmake
VisualStudio 2010 beta1
VisualStudio と UTF-8
Visual Studio 2008 IDE で MP を使う
Visual Studio 2008
_T() と TEXT() の違いやソースの文字コード
64bit 開発設定のメモ

PC の RAM を 18GB に増設

DDR3 4GB がおよそ 5000円、3枚セットで 15000円で手に入ると聞いたので
メモリ増設してみました。
もともと 6GB だったので 4GBx3 = 12GB を足して合計 18GB。

6GB でも特に不自由していなかったので
すごい速くなった~というような感動は全く無いです。

HDD → SSD なら確実に高速化ですが、
RAM 増設の効果は高速化でなく「過負荷でも遅くならない」こと。

ページファイルは切っています。
今までの仮想メモリよりも物理メモリの方が多くなったので。

起動したまま長時間放置してたアプリが
スワップアウトしないでスッと戻ってくるのがいい。

多数のアプリを起動しっぱなしのまま長時間使っていると、
使ってなかったアプリがページファイルに送られてしまうことがあります。

タスクバーのアイコンをクリックしたとき、いかにもディスクからメモリを
巻き戻していますといった感じでガリガリ言いながら VisualStudio が
ゆっくり起きてくることがありますが
そう言うのはなくなりました。

RAM は全く使い切れません。
作業時でも 3GB 程度 + キャッシュで 5GB くらい。
完全な未使用領域が 10GB 近くあります。

何日か稼動し続けてると徐々にディスクキャッシュが増えていくことはわかりました。
まだ完全にメモリを埋めたことがなく、少なくても 1日では使い切れません。

Windows 7 なら余っていても、ディスクキャッシュで有効に使ってくれるだろう
とか漠然と考えていたのは甘かったです。

とりあえず経験したことがない広大なメモリなので、
どうやって使いこなすか考える楽しみがあります。
でもきっと数年後にはそんな小さな容量、とか思うのでしょう。

Bluetooth リモートキーボード with Play Station 3

新しい VAIO シリーズには羨ましい機能があります。

リモートキーボード with PlayStationR3

古い type P でも使えるそうなので VAIO を Bluetooth Keyboard として
繋いでみました。
残念ながら Windows 上のキーカスタマイズは無効となるようです。

デバイスとして「 VAIO Bluetooth Driver over USB device 」が追加されており
ドライバレベルで入力をフックしているようです。
USB の HID をそのまま Bluetooth に変換しているだけかもしれません。

関連エントリ
PS3 ワイヤレスキーパッド を スマートフォン と PC で使う (5)