計測ビルドの作成
PGO によるトレーニングは、PGO 計測を含むタイトルのビルドに依存します。PGO はこの計測を使用して、どのコード パスが最も頻繁に実行されるかを判断します。計測ビルドを作成するために必要なのは、Visual Studio で 2 つのビルド プロパティを設定するだけです。計測ビルドを作成するには
- ソリューション エクスプローラー でプロジェクトを右クリックし、プロパティ を選択します。
- プロパティ ページ ダイアログ ボックスで、構成プロパティ および C/C++ ノードを展開します。
- 最適化 プロパティ ページを選択し、プログラム全体の最適化 を はい に設定します (図 1)。図 1. プログラム全体の最適化プロパティの設定。

- リンカー ノードを展開します。
- 最適化 プロパティ ページを選択し、リンク時のコード生成 を プロファイル ガイド付き最適化 - 計測 に設定します (図 2)。図 2. 計測ビルド用のリンク時のコード生成プロパティの設定。
[!NOTE] この手順で説明した 2 つのプロパティは、MSBuild における /GLコンパイラ スイッチと/LTCG:PGInstrumentリンカー スイッチに対応しています。 - 計測ビルドをビルドして XBOX One コンソールにデプロイします。タイトルの実行中、PGO ファイルが図 3 のようにタイトルの一部としてデプロイされていることが確認できます。図 3. 計測ビルドによってデプロイされる PGO ファイル。

必要なファイルのデプロイ
Microsoft Game Development Kit (GDK) には、PGO を使用するためにタイトルと一緒にデプロイする必要がある 3 つのファイルが含まれています。1 つは psapi.dll という名前で、C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin にインストールされます。他の 2 つ、pgort140.dll と pgosweep.exe は、Visual Studio のインストールに含まれています。 MSBuild を使用してタイトルをビルドしている場合、計測ビルドを作成すると、これらのファイルは自動的に Layout ディレクトリにコピーされます。makefiles を使用してタイトルをビルドしている場合は、これら 3 つのファイルを Layout ディレクトリに手動で追加して、タイトルとともにデプロイされるようにする必要があります。Visual Studio でこれらのファイルをプロジェクトに追加し、ビルドから除外することは、ファイルを Layout ディレクトリにコピーしてタイトルとともにデプロイする便利な方法です。
Visual Studio プロジェクトに必要なファイルを追加するには
- ソリューション エクスプローラー でプロジェクトを右クリックし、追加、次に 既存の項目 を選択します (図 4)。図 4. プロジェクトへの PGO ファイルの追加。

- C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin に移動し、PGO ファイル (psapi.dll) を選択して、追加 を選択してファイルをプロジェクトに追加します。
- ツールセット用の C:\Program Files (x86)\Microsoft Visual Studio\2019\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore または C:\Program Files\Microsoft Visual Studio\2022\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore に移動し、PGO ファイル (pgort140.dll と pgosweep.exe) を選択します。次に 追加 を選択してファイルをプロジェクトに追加します。
- ソリューション エクスプローラー で pgort140.dll を右クリックし、プロパティ を選択します。
- プロパティ ページ ダイアログ ボックスで、構成プロパティ ノードを展開し、全般 プロパティ ページを選択します。
- ビルドから除外 を はい に設定し、次に 項目の種類 を ビルドに参加しません に設定します (図 5)。図 5. ビルドからの PGO ファイルの除外。

計測ビルドでのトレーニング
トレーニングは PGO の最も重要なフェーズです。PGO で得られるパフォーマンスの向上は、アプリケーションがどれだけよくトレーニングされたかに直接的に依存します。PGO のトレーニング フェーズでは、タイトルを実行しながら一般的なパフォーマンス重視のシナリオを実行します。 一般的なパフォーマンス シナリオを実行した後、トレーニング データをキャプチャする PGO 成果物 (.pgc) ファイルの収集を開始します。pgosweep.exe を使用して .pgc ファイルを生成します (図 6)。 図 6. pgosweep.exe の実行。


最適化ビルドの作成
最適化ビルドを作成するには、リンク時のコード生成 プロパティを プロファイル ガイド付き最適化 - 更新 に設定します (図 9)。 図 9. 最適化ビルド用のリンク時のコード生成プロパティの設定。
このプロパティは MSBuild の
/LTCG:PGOptimize リンカー スイッチに対応します。
XBOX 向け PGO の推奨事項
前述の手順は、組み込みの Visual Studio プロジェクト プロパティを使用して、XBOX 上の Microsoft Game Development Kit (GDK) で PGO を使用するための概要を提供します。ただし、Visual C++ コンパイラは、Visual Studio 2019 および Visual Studio 2022 の Visual Studio プロジェクト プロパティが制御する/LTCG:PGInstrument、/LTCG:PGOptimize、/LTCG:PGUpdate スイッチを介した PGO の使用を非推奨としています。
推奨される置き換えは次のとおりです。
- C/C++ コンパイラでは、
/GLを使用します (先の図 1 に示すように、プログラム全体の最適化 プロパティを はい (/GL) に設定します)。 - リンカーでは、
/LTCGを使用します (図 11 に示すように、リンク時のコード生成 プロパティを リンク時のコード生成を使用する (/LTCG) に設定します)。図 11. リンク時のコード生成プロパティの設定。
- PGO プロファイルを生成するには
/FASTGENPROFILEまたは/GENPROFILEを使用します (図 12)。これらのスイッチの詳細については、Microsoft Docs の /GENPROFILE、/FASTGENPROFILE (プロファイリング計測ビルドの生成) を参照してください。図 12. PGO プロファイルを生成するリンカー スイッチの設定。
- PGO プロファイルのセットに対して最適化を行うには
/USEPROFILEを使用します (図 13)。このスイッチの詳細については、Microsoft Docs の /USEPROFILE (スレッド セーフ モードでの PGO の実行) を参照してください。図 13. PGO プロファイルのセットに対して最適化を行うリンカー スイッチの設定。
PGO のトラブルシューティング
実行時パフォーマンス
計測ビルドをプロファイリングする際、ツールがパフォーマンスの問題を引き起こす可能性があります。このような問題により、タイトルの制御が困難になる場合があります。/FASTGENPROFILE スイッチは、インタラクティブなゲーム セッションのプロファイリング用に計測ビルドを高速化するのに適した選択肢です。
依存関係
PGO 計測を有効にした後、タイトルが読み込まれなくなった場合、タイトルの .exe ファイルと同じフォルダーに pgort140.dll と vcruntime140.dll があることを確認してください。 pgosweep.exe の実行が失敗した場合 (通常は STATUS_DLL_NOT_FOUND エラー)、タイトルの .exe ファイルと同じフォルダーに pgort140.dll、psapi.dll、vcruntime140.dll が存在することを確認してください。 また、pgort140.dll と pgosweep.exe の x64 onecore バージョンを使用していることを確認してください。メモリ使用量
PGO はプロファイルをキャプチャするためにメモリを使用しますが、これは利用可能なメモリの大部分を使用するタイトルにとって課題になる場合があります。PGO を正常に実行するには、xbconfig.exe の ExtraTitleMemory 設定、XMemTransferMemory 関数、またはその両方を使用する必要がある場合があります。/LTCG:PGInstrument または /GENPROFILE の代わりに /FASTGENPROFILE を使用すると、同様の結果でメモリ フットプリントが小さくなります。
[!NOTE] 2020 年 6 月の GDK (およびその QFE) に同梱される PGO のバージョンはタイトル メモリを使用します。PGO は今後のリリースでツーリング メモリを適切に使用するように更新されます。
