> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Visual Studio でのプロファイルガイド付き最適化

> Visual Studio でのプロファイルガイド付き最適化

このトピックでは、XBOX Series X Dev Kitまたは XBOX One 開発キット上でデプロイおよび実行されるゲームに対して、[プロファイル ガイド付き最適化](https://learn.microsoft.com/cpp/build/profile-guided-optimizations) (PGO) を使用する方法について説明します。PGO は、重要またはパフォーマンス重視のユーザー シナリオを実行中に収集されたプロファイリング データを使用して、タイトルの最適化バージョンをビルドするランタイム コンパイラ最適化技術です。

プロファイル ガイド付き最適化は、タイトルが小売環境でどのように使用される可能性があるかに基づくため、従来の静的最適化に対して大きな利点があります。PGO は、一般的なユーザー シナリオに対応するコード パスでは速度を優先し、一般的でないユーザー シナリオではサイズを優先します。その結果、一般的なシナリオではより高速なコード、あまり頻繁に使用されないシナリオではより小さなコードが得られます。

PGO によるパフォーマンス向上はタイトルによって異なりますが、5〜30 パーセントの向上が期待できます。PGO はアプリケーションの GPU 中心の部分のパフォーマンスには対応しないことに注意してください。

## 計測ビルドの作成

PGO によるトレーニングは、PGO 計測を含むタイトルのビルドに依存します。PGO はこの計測を使用して、どのコード パスが最も頻繁に実行されるかを判断します。計測ビルドを作成するために必要なのは、Visual Studio で 2 つのビルド プロパティを設定するだけです。

### 計測ビルドを作成するには

1. **ソリューション エクスプローラー** でプロジェクトを右クリックし、**プロパティ** を選択します。
2. **プロパティ ページ** ダイアログ ボックスで、**構成プロパティ** および **C/C++** ノードを展開します。
3. **最適化** プロパティ ページを選択し、**プログラム全体の最適化** を **はい** に設定します (図 1)。**図 1. プログラム全体の最適化プロパティの設定。** ![Screenshot that shows the location of the Whole Program Optimization property](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_wpo.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=6ecb0d86d212e2b6aa8c5c95d0cf4d40)
4. **リンカー** ノードを展開します。
5. **最適化** プロパティ ページを選択し、**リンク時のコード生成** を **プロファイル ガイド付き最適化 - 計測** に設定します (図 2)。**図 2. 計測ビルド用のリンク時のコード生成プロパティの設定。** ![Screenshot that shows the location of the Link Time Code Generation property, set to create an instrumented build](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_instrumented_build.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=03a70b82d39722d95fc1ccfef8ceb5cd) \[!NOTE] この手順で説明した 2 つのプロパティは、MSBuild における `/GL` コンパイラ スイッチと `/LTCG:PGInstrument` リンカー スイッチに対応しています。
6. 計測ビルドをビルドして XBOX コンソールにデプロイします。タイトルの実行中、PGO ファイルが図 3 のようにタイトルの一部としてデプロイされていることが確認できます。**図 3. 計測ビルドによってデプロイされる PGO ファイル。** ![CLI directory that shows the deployed PGO files](https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_deployed_files.png?fit=max\&auto=format\&n=z-rLYkO3Ax6HPtgm\&q=85\&s=30778992c2fee2f3762bac43a8269b48)

## 必要なファイルのデプロイ

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 プロジェクトに必要なファイルを追加するには

1. **ソリューション エクスプローラー** でプロジェクトを右クリックし、**追加**、次に **既存の項目** を選択します (図 4)。**図 4. プロジェクトへの PGO ファイルの追加。** ![Screenshot that shows how to add a file to a project](https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_add_binaries.png?fit=max\&auto=format\&n=z-rLYkO3Ax6HPtgm\&q=85\&s=7f212c1d64c1eb1ca76e4ed731fb1ef8)
2. *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin* に移動し、PGO ファイル (*psapi.dll*) を選択して、**追加** を選択してファイルをプロジェクトに追加します。
3. ツールセット用の *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*) を選択します。次に **追加** を選択してファイルをプロジェクトに追加します。
4. **ソリューション エクスプローラー** で *pgort140.dll* を右クリックし、**プロパティ** を選択します。
5. **プロパティ ページ** ダイアログ ボックスで、**構成プロパティ** ノードを展開し、**全般** プロパティ ページを選択します。
6. **ビルドから除外** を **はい** に設定し、次に **項目の種類** を **ビルドに参加しません** に設定します (図 5)。**図 5. ビルドからの PGO ファイルの除外。** ![Screenshot that shows how to exclude a PGO file from builds](https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_exclude_binaries.png?fit=max\&auto=format\&n=z-rLYkO3Ax6HPtgm\&q=85\&s=3ad61a9625ce53e6776c58e0f8f990d5)

これで、PGO ファイルは *Layout* ディレクトリにコピーされ、タイトルとともにデプロイされます。

## 計測ビルドでのトレーニング

トレーニングは PGO の最も重要なフェーズです。PGO で得られるパフォーマンスの向上は、アプリケーションがどれだけよくトレーニングされたかに直接的に依存します。PGO のトレーニング フェーズでは、タイトルを実行しながら一般的なパフォーマンス重視のシナリオを実行します。

一般的なパフォーマンス シナリオを実行した後、トレーニング データをキャプチャする PGO 成果物 (.pgc) ファイルの収集を開始します。*pgosweep.exe* を使用して .pgc ファイルを生成します (図 6)。

**図 6. pgosweep.exe の実行。**

![Screenshot that shows pgosweep.exe being run by using the command "xbrun /x/title /O g:\pgosweep.exe Direct3DGame1.exe d:\Direct3DGame1!1.pgc"](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_run_pgosweep.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=19e5af6dae653bff3e8ff35815c156bf)

この例では、*Direct3DGame1!1.pgc* という名前の .pgc ファイルを作成しました。.pgc ファイルを作成する際、通常は *titlename!#.pgc* という規則を使用します。ここで *titlename* は実行中のタイトルの名前で、*#* は以前に作成した *titlename!#.pgc* ファイルの数に 1 を足した値です。

*pgosweep.exe* を実行するたびに個別の .pgc ファイルが作成されます。理想的には、さまざまなパフォーマンス重視のシナリオを表す多数の .pgc ファイルを作成します。.pgc ファイルの作成が完了すると、図 7 のようにコンソールの *D:\\* ディレクトリ (すなわち SystemScratch) で確認できます。

**図 7. 連続した名前が付けられた .pgc ファイル。**

![Screenshot that shows a directory listing of three sequentially named .pgc files](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_files.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=9fb63ae09835246453011a1e670267e3)

次に、.pgc ファイルを .pgd ファイルという別の PGO 成果物にマージする必要があります。.pgd ファイルは PGO の最終フェーズである最適化においてコンパイラによって使用されます。

最適化を開始する前に、[xbcp.exe](https://docs.xbox.com/ja-jp/tools/tools-console/commandlinetools/xbcp.md) を使用してコンソールから PC に .pgc ファイルをコピーします。.pgc ファイルはビルド出力ディレクトリにコピーする必要があります (図 8 では、ビルド出力ディレクトリは *C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release* です)。

**図 8. .pgc ファイルをビルド出力ディレクトリにコピーする。**

![Screenshot that shows .pgc files being copied from the console to a build output directory](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_file_copy.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=2968da3f83e400958c52e50eb65f5ac4)

## 最適化ビルドの作成

最適化ビルドを作成するには、**リンク時のコード生成** プロパティを **プロファイル ガイド付き最適化 - 更新** に設定します (図 9)。

**図 9. 最適化ビルド用のリンク時のコード生成プロパティの設定。**

![Screenshot that shows the location of the Link Time Code Generation property, set to create an optimized build](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=8b2cca5395984b3e25478674c66d0a6e)

> [!NOTE]
>
> このプロパティは MSBuild の `/LTCG:PGOptimize` リンカー スイッチに対応します。

タイトルを再ビルドすると、ビルド出力には図 10 のような PGO 関連のメッセージが含まれます。

**図 10. ビルド出力の PGO 関連メッセージ。**

![Screenshot that shows an excerpt of build output that includes PGO-related messages](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build_output.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=67ad41198da6a7925eeca4761b438038)

## 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. リンク時のコード生成プロパティの設定。** ![Screenshot that shows the location of the Link Time Code Generation property](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch1.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=d5400ad2c7d5451776e58d3454a56095)

次に、**コマンド ライン** プロパティ ページの **追加オプション** ボックスに次の新しいリンカー スイッチのいずれかを追加して使用します:

* PGO プロファイルを生成するには `/FASTGENPROFILE` または `/GENPROFILE` を使用します (図 12)。これらのスイッチの詳細については、Microsoft Docs の [/GENPROFILE、/FASTGENPROFILE (プロファイリング計測ビルドの生成)](https://learn.microsoft.com/cpp/build/reference/genprofile-fastgenprofile-generate-profiling-instrumented-build) を参照してください。**図 12. PGO プロファイルを生成するリンカー スイッチの設定。** ![Screenshot that shows the /FASTGENPROFILE linker switch added to the Command Line property page](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch2.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=6d24306b34e2a2282af826c5d05e9075)
* PGO プロファイルのセットに対して最適化を行うには `/USEPROFILE` を使用します (図 13)。このスイッチの詳細については、Microsoft Docs の [/USEPROFILE (スレッド セーフ モードでの PGO の実行)](https://learn.microsoft.com/cpp/build/reference/useprofile) を参照してください。**図 13. PGO プロファイルのセットに対して最適化を行うリンカー スイッチの設定。** ![Screenshot that shows the /USEPROFILE linker switch added to the Command Line property page](https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch3.png?fit=max\&auto=format\&n=stYRJgFi22xot4tO\&q=85\&s=6eb5e198e65bf9ced6af8c947c5702a0)

## 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](https://docs.xbox.com/ja-jp/tools/tools-console/commandlinetools/xbconfig.md) の ExtraTitleMemory 設定、[XMemTransferMemory](https://docs.xbox.com/ja-jp/reference/system/xmem/functions/xmemtransfermemory.md) 関数、またはその両方を使用する必要がある場合があります。

`/LTCG:PGInstrument` または `/GENPROFILE` の代わりに `/FASTGENPROFILE` を使用すると、同様の結果でメモリ フットプリントが小さくなります。

\[!NOTE] 2020 年 6 月の GDK (およびその QFE) に同梱される PGO のバージョンはタイトル メモリを使用します。PGO は今後のリリースでツーリング メモリを適切に使用するように更新されます。

## 関連項目

[プロファイル ガイド付き最適化](https://docs.xbox.com/ja-jp/tools/tools-console/pgo/pgo.md) [XBOX コンソールゲーム開発 (環境とツール)](https://docs.xbox.com/ja-jp/tools/tools-console/gc-tools-console-toc.md)


## Related topics

- [プロファイルガイド付き最適化](https://docs.xbox.com/ja-jp/tools/tools-console/pgo/pgo.md)
- [Visual C++ コンパイラとリンカーのスイッチに関する推奨事項](https://docs.xbox.com/ja-jp/tools/tools-console/visualstudio/compiler-switch-recommendations.md)
- [XBOX タイトル向けの Profile-Guided Optimization (PGO)](https://docs.xbox.com/ja-jp/tools/tools-console/pgo/index.md)
- [チュートリアル: プレイヤー プロファイルの取得](https://docs.xbox.com/ja-jp/services/playfab/player-progression/player-data/getting-player-profiles.md)
- [PlayFab Party テキスト読み上げおよびテキスト入力 UX ガイドライン](https://docs.xbox.com/ja-jp/services/playfab/community/voice-communications/party-text-to-speech-ux-guidelines.md)
