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

# Visual Studio 中的分析導引最佳化

> Visual Studio 中的分析導引最佳化

本主題說明如何對部署並執行於 XBOX Series X 開發套件或 XBOX One 開發套件上的遊戲使用[分析導引最佳化](https://learn.microsoft.com/cpp/build/profile-guided-optimizations) (PGO)。PGO 是一種執行階段編譯器最佳化技術，它會使用執行重要或以效能為中心的使用者情境時所收集的分析資料，建置遊戲的最佳化版本。

分析導引最佳化相較於傳統的靜態最佳化有顯著的優勢，因為它是根據遊戲在零售環境中可能的使用方式進行。PGO 會針對對應常見使用者情境的程式碼路徑優先考量速度，並針對不常見的使用者情境優先考量大小。結果是常見情境的程式碼更快，而較少使用之情境的程式碼更小。

PGO 帶來的效能提升因遊戲而異，但您可以預期有 5% 到 30% 的提升。請注意，PGO 無法改善應用程式中以 GPU 為中心之部分的效能。

## 建立檢測組建

使用 PGO 進行訓練需要依賴包含 PGO 檢測的遊戲組建。PGO 會使用此檢測來判斷哪些程式碼路徑最常執行。若要建立檢測組建，您只需要在 Visual Studio 中設定兩個組建屬性。

#### 建立檢測組建

1. 在**方案總管**中，以滑鼠右鍵按一下您的專案，然後選取 **Properties**。
2. 在 **Property Pages** 對話方塊中，展開 **Configuration Properties** 與 **C/C++** 節點。
3. 選取 **Optimization** 屬性頁面，然後將 **Whole Program Optimization** 設定為 **Yes** (圖 1)。**圖 1. 設定 Whole Program Optimization 屬性。** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_wpo.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6ecb0d86d212e2b6aa8c5c95d0cf4d40" alt="顯示 Whole Program Optimization 屬性位置的螢幕擷取畫面" width="787" height="545" data-path="images/gdk/tools/pgo_wpo.png" />
4. 展開 **Linker** 節點。
5. 選取 **Optimization** 屬性頁面，然後將 **Link Time Code Generation** 設定為 **Profile Guided Optimization - Instrument** (圖 2)。**圖 2. 為檢測組建設定 Link Time Code Generation 屬性。** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_instrumented_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=03a70b82d39722d95fc1ccfef8ceb5cd" alt="顯示 Link Time Code Generation 屬性位置的螢幕擷取畫面，該屬性已設定為建立檢測組建" width="787" height="546" data-path="images/gdk/tools/pgo_instrumented_build.png" /> \[!NOTE] 此程序中所述的兩個屬性對應於 MSBuild 中的 `/GL` 編譯器參數與 `/LTCG:PGInstrument` 連結器參數。
6. 建置檢測組建並將其部署到 XBOX One 主機。遊戲執行時，您可以看到 PGO 檔案已作為遊戲的一部分部署，類似圖 3。**圖 3. 檢測組建所部署的 PGO 檔案。** <img src="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" alt="顯示已部署之 PGO 檔案的 CLI 目錄螢幕擷取畫面" width="554" height="462" data-path="images/gdk/tools/pgo_deployed_files.png" />

## 部署必要檔案

Microsoft Game Development Kit (GDK) 包含三個必須與遊戲一起部署才能使用 PGO 的檔案。其中一個名為 *psapi.dll* 的檔案會安裝至 *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*。另外兩個名為 *pgort140.dll* 與 *pgosweep.exe* 的檔案則來自您的 Visual Studio 安裝。

如果您使用 MSBuild 建置遊戲，建立檢測組建時，這些檔案會自動複製到您的 *Layout* 目錄中。

如果您使用 `makefiles` 建置遊戲，則需要手動將這三個檔案新增至 *Layout* 目錄，讓它們與遊戲一起部署。在 Visual Studio 中，將這些檔案新增至專案並將其從組建中排除，是讓檔案複製到 *Layout* 目錄並與遊戲一起部署的便利方式。

#### 將必要檔案新增至 Visual Studio 專案

1. 在**方案總管**中，以滑鼠右鍵按一下您的專案，選取 **Add**，然後選取 **Existing Item** (圖 4)。**圖 4. 將 PGO 檔案新增至專案。** <img src="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" alt="顯示如何將檔案新增至專案的螢幕擷取畫面" width="669" height="532" data-path="images/gdk/tools/pgo_add_binaries.png" />
2. 前往 *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*，選取 PGO 檔案 (*psapi.dll*)，然後選取 **Add** 將檔案新增至專案。
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*)。接著選取 **Add** 將檔案新增至專案。
4. 在**方案總管**中，以滑鼠右鍵按一下 *pgort140.dll*，然後選取 **Properties**。
5. 在 **Property Pages** 對話方塊中，展開 **Configuration Properties** 節點，然後選取 **General** 屬性頁面。
6. 將 **Excluded From Build** 設定為 **Yes**，然後將 **Item Type** 設定為 **Does not participate in build** (圖 5)。**圖 5. 將 PGO 檔案從組建中排除。** <img src="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" alt="顯示如何將 PGO 檔案從組建中排除的螢幕擷取畫面" width="788" height="640" data-path="images/gdk/tools/pgo_exclude_binaries.png" />

現在 PGO 檔案會複製到您的 *Layout* 目錄，並與遊戲一起部署。

## 使用檢測組建進行訓練

訓練是 PGO 最重要的階段。透過 PGO 獲得的效能提升，直接取決於應用程式的訓練程度。在 PGO 的訓練階段，請在遊戲執行時演練常見的以效能為中心的情境。

演練常見效能情境之後，起始收集 PGO 成品 (.pgc) 檔案，以擷取您的訓練資料。使用 *pgosweep.exe* 產生 .pgc 檔案 (圖 6)。

**圖 6. 執行 pgosweep.exe。**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_run_pgosweep.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=19e5af6dae653bff3e8ff35815c156bf" alt="顯示使用命令 &#x22;xbrun /x/title /O g:\pgosweep.exe Direct3DGame1.exe d:\Direct3DGame1!1.pgc&#x22; 執行 pgosweep.exe 的螢幕擷取畫面" width="740" height="68" data-path="images/gdk/tools/pgo_run_pgosweep.png" />

在此範例中，我們建立了名為 *Direct3DGame1!1.pgc* 的 .pgc 檔案。建立 .pgc 檔案時，我們通常使用 *titlename!#.pgc* 慣例，其中 *titlename* 是執行中遊戲的名稱，而 *#* 是您先前建立的 *titlename!#.pgc* 檔案數目加 1。

每次執行 *pgosweep.exe* 都會建立一個獨立的 .pgc 檔案。理想情況下，您會建立許多代表各種以效能為中心之情境的 .pgc 檔案。建立完 .pgc 檔案後，您可以在**主機**的 *D:\\* 目錄 (也就是 SystemScratch) 中看到它們，類似圖 7。

**圖 7. 依序命名的 .pgc 檔案。**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_files.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=9fb63ae09835246453011a1e670267e3" alt="顯示三個依序命名之 .pgc 檔案的目錄清單螢幕擷取畫面" width="509" height="204" data-path="images/gdk/tools/pgo_pgc_files.png" />

接下來，您需要將 .pgc 檔案合併至另一個稱為 .pgd 檔案的 PGO 成品。編譯器會在 PGO 的最後一個階段 (也就是最佳化) 使用 .pgd 檔案。

開始最佳化之前，請使用 [xbcp.exe](/zh-TW/tools/tools-console/commandlinetools/xbcp) 將 .pgc 檔案從主機複製回 PC。.pgc 檔案必須複製到您的組建輸出目錄。(在圖 8 中，組建輸出目錄是 *C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release*。)

**圖 8. 將 .pgc 檔案複製到組建輸出目錄。**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_file_copy.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=2968da3f83e400958c52e50eb65f5ac4" alt="顯示將 .pgc 檔案從主機複製到組建輸出目錄的螢幕擷取畫面" width="651" height="129" data-path="images/gdk/tools/pgo_pgc_file_copy.png" />

## 建立最佳化組建

若要建立最佳化組建，請將 **Link Time Code Generation** 屬性設定為 **Profile Guided Optimization - Update** (圖 9)。

**圖 9. 為最佳化組建設定 Link Time Code Generation 屬性。**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=8b2cca5395984b3e25478674c66d0a6e" alt="顯示 Link Time Code Generation 屬性位置的螢幕擷取畫面，該屬性已設定為建立最佳化組建" width="787" height="543" data-path="images/gdk/tools/pgo_optimized_build.png" />

<Note>
  此屬性對應於 MSBuild 中的 `/LTCG:PGOptimize` 連結器參數。
</Note>

重新建置遊戲後，您的組建輸出會包含與 PGO 相關的訊息，類似圖 10 中的訊息。

**圖 10. 組建輸出中與 PGO 相關的訊息。**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build_output.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=67ad41198da6a7925eeca4761b438038" alt="顯示組建輸出摘錄 (包含與 PGO 相關訊息) 的螢幕擷取畫面" width="731" height="263" data-path="images/gdk/tools/pgo_optimized_build_output.png" />

## XBOX PGO 的建議

前述說明概述了如何使用內建的 Visual Studio 專案屬性，在 XBOX 上的 Microsoft Game Development Kit (GDK) 中使用 PGO。不過，Visual C++ 編譯器已淘汰透過 `/LTCG:PGInstrument`、`/LTCG:PGOptimize` 與 `/LTCG:PGUpdate` 參數使用 PGO 的方式，而這些參數正是 Visual Studio 2019 與 Visual Studio 2022 中 Visual Studio 專案屬性所控制的。

建議的替代方式如下。

* 對於 C/C++ 編譯器，請使用 `/GL` (將 **Whole Program Optimization** 屬性設定為 **Yes (/GL)**，如先前的圖 1 所示)。
* 對於連結器，請使用 `/LTCG` (將 **Link Time Code Generation** 屬性設定為 **Use Link Time Code Generation (/LTCG)**，如圖 11 所示)。**圖 11. 設定 Link Time Code Generation 屬性。** <img src="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" alt="顯示 Link Time Code Generation 屬性位置的螢幕擷取畫面" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch1.png" />

接著，將下列其中一個新的連結器參數新增至 **Command Line** 屬性頁面上的 **Additional Options** 方塊：

* `/FASTGENPROFILE` 或 `/GENPROFILE`，用於產生 PGO 設定檔 (圖 12)。如需這些參數的詳細資訊，請參閱 Microsoft Docs 上的 [/GENPROFILE、/FASTGENPROFILE (產生分析檢測組建)](https://learn.microsoft.com/cpp/build/reference/genprofile-fastgenprofile-generate-profiling-instrumented-build)。**圖 12. 設定連結器參數以產生 PGO 設定檔。** <img src="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" alt="顯示 /FASTGENPROFILE 連結器參數已新增至 Command Line 屬性頁面的螢幕擷取畫面" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch2.png" />
* `/USEPROFILE`，用於針對一組 PGO 設定檔進行最佳化 (圖 13)。如需此參數的詳細資訊，請參閱 Microsoft Docs 上的 [/USEPROFILE (以執行緒安全模式執行 PGO)](https://learn.microsoft.com/cpp/build/reference/useprofile)。**圖 13. 設定連結器參數以針對一組 PGO 設定檔進行最佳化。** <img src="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" alt="顯示 /USEPROFILE 連結器參數已新增至 Command Line 屬性頁面的螢幕擷取畫面" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch3.png" />

## 疑難排解 PGO

### 執行階段效能

分析檢測組建時，工具可能會造成效能問題。這類問題可能會讓您的遊戲難以操控。`/FASTGENPROFILE` 參數是讓檢測組建在分析互動式遊戲工作階段時更快速的好選擇。

### 相依性

如果您啟用 PGO 檢測後發現遊戲無法再載入，請確認 *pgort140.dll* 與 *vcruntime140.dll* 與遊戲的 .exe 檔案位於同一個資料夾中。

如果嘗試執行 *pgosweep.exe* 失敗 (通常會出現 STATUS\_DLL\_NOT\_FOUND 錯誤)，請確認 *pgort140.dll*、*psapi.dll* 與 *vcruntime140.dll* 與遊戲的 .exe 檔案位於同一個資料夾中。

此外，請確定您使用的是 x64 *onecore* 版本的 *pgort140.dll* 與 *pgosweep.exe*。

### 記憶體使用量

PGO 會使用記憶體擷取設定檔，這對使用大量可用記憶體的遊戲來說可能是一項挑戰。若要成功執行 PGO，您可能需要使用 [xbconfig.exe](/zh-TW/tools/tools-console/commandlinetools/xbconfig) 中的 ExtraTitleMemory 設定、[XMemTransferMemory](/zh-TW/reference/system/xmem/functions/xmemtransfermemory) 函式，或兩者都使用。

使用 `/FASTGENPROFILE` 而非 `/LTCG:PGInstrument` 或 `/GENPROFILE`，可以用較小的記憶體使用量獲得類似的結果。

\[!NOTE] 2020 年 6 月 GDK (及其 QFE) 中隨附的 PGO 版本會使用遊戲記憶體。未來的版本將更新 PGO，使其正確使用工具記憶體。

## 另請參閱

[分析導引最佳化](/zh-TW/tools/tools-console/pgo/pgo) [XBOX 主機遊戲開發 (環境與工具)](/zh-TW/tools/tools-console/gc-tools-console-toc)


## Related topics

- [分析導引最佳化](/zh-TW/tools/tools-console/pgo/pgo.md)
- [XBOX 遊戲的分析導引最佳化 (PGO)](/zh-TW/tools/tools-console/pgo/index.md)
- [Visual C++ 編譯器與連結器參數建議](/zh-TW/tools/tools-console/visualstudio/compiler-switch-recommendations.md)
- [XBOX 環境工具與 API](/zh-TW/tools/tools-console/gc-xbox-tools-and-apis-toc.md)
- [XBOX 主機遊戲開發環境與工具](/zh-TW/tools/tools-console/gc-tools-console-toc.md)
