建立檢測組建
使用 PGO 進行訓練需要依賴包含 PGO 檢測的遊戲組建。PGO 會使用此檢測來判斷哪些程式碼路徑最常執行。若要建立檢測組建,您只需要在 Visual Studio 中設定兩個組建屬性。建立檢測組建
- 在方案總管中,以滑鼠右鍵按一下您的專案,然後選取 Properties。
- 在 Property Pages 對話方塊中,展開 Configuration Properties 與 C/C++ 節點。
- 選取 Optimization 屬性頁面,然後將 Whole Program Optimization 設定為 Yes (圖 1)。圖 1. 設定 Whole Program Optimization 屬性。

- 展開 Linker 節點。
- 選取 Optimization 屬性頁面,然後將 Link Time Code Generation 設定為 Profile Guided Optimization - Instrument (圖 2)。圖 2. 為檢測組建設定 Link Time Code Generation 屬性。
[!NOTE] 此程序中所述的兩個屬性對應於 MSBuild 中的
/GL編譯器參數與/LTCG:PGInstrument連結器參數。 - 建置檢測組建並將其部署到 XBOX One 主機。遊戲執行時,您可以看到 PGO 檔案已作為遊戲的一部分部署,類似圖 3。圖 3. 檢測組建所部署的 PGO 檔案。

部署必要檔案
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 專案
- 在方案總管中,以滑鼠右鍵按一下您的專案,選取 Add,然後選取 Existing Item (圖 4)。圖 4. 將 PGO 檔案新增至專案。

- 前往 C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin,選取 PGO 檔案 (psapi.dll),然後選取 Add 將檔案新增至專案。
- 針對您的工具組,前往 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 將檔案新增至專案。
- 在方案總管中,以滑鼠右鍵按一下 pgort140.dll,然後選取 Properties。
- 在 Property Pages 對話方塊中,展開 Configuration Properties 節點,然後選取 General 屬性頁面。
- 將 Excluded From Build 設定為 Yes,然後將 Item Type 設定為 Does not participate in build (圖 5)。圖 5. 將 PGO 檔案從組建中排除。

使用檢測組建進行訓練
訓練是 PGO 最重要的階段。透過 PGO 獲得的效能提升,直接取決於應用程式的訓練程度。在 PGO 的訓練階段,請在遊戲執行時演練常見的以效能為中心的情境。 演練常見效能情境之後,起始收集 PGO 成品 (.pgc) 檔案,以擷取您的訓練資料。使用 pgosweep.exe 產生 .pgc 檔案 (圖 6)。 圖 6. 執行 pgosweep.exe。


建立最佳化組建
若要建立最佳化組建,請將 Link Time Code Generation 屬性設定為 Profile Guided Optimization - Update (圖 9)。 圖 9. 為最佳化組建設定 Link Time Code Generation 屬性。
此屬性對應於 MSBuild 中的
/LTCG:PGOptimize 連結器參數。
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 屬性。
/FASTGENPROFILE或/GENPROFILE,用於產生 PGO 設定檔 (圖 12)。如需這些參數的詳細資訊,請參閱 Microsoft Docs 上的 /GENPROFILE、/FASTGENPROFILE (產生分析檢測組建)。圖 12. 設定連結器參數以產生 PGO 設定檔。
/USEPROFILE,用於針對一組 PGO 設定檔進行最佳化 (圖 13)。如需此參數的詳細資訊,請參閱 Microsoft Docs 上的 /USEPROFILE (以執行緒安全模式執行 PGO)。圖 13. 設定連結器參數以針對一組 PGO 設定檔進行最佳化。
疑難排解 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 中的 ExtraTitleMemory 設定、XMemTransferMemory 函式,或兩者都使用。 使用/FASTGENPROFILE 而非 /LTCG:PGInstrument 或 /GENPROFILE,可以用較小的記憶體使用量獲得類似的結果。
[!NOTE] 2020 年 6 月 GDK (及其 QFE) 中隨附的 PGO 版本會使用遊戲記憶體。未來的版本將更新 PGO,使其正確使用工具記憶體。
