创建插桩版本
使用 PGO 进行训练需要包含 PGO 插桩的游戏版本。PGO 使用此插桩来确定哪些代码路径执行得最频繁。若要创建插桩版本,只需在 Visual Studio 中设置两个生成属性。创建插桩版本
- 在解决方案资源管理器中,右键单击你的项目,然后选择属性。
- 在属性页对话框中,展开配置属性和 C/C++ 节点。
- 选择优化属性页,然后将整个程序优化设置为是(图 1)。图 1. 设置整个程序优化属性。

- 展开链接器节点。
- 选择优化属性页,然后将链接时间代码生成设置为 Profile Guided Optimization - Instrument(图 2)。图 2. 为插桩版本设置链接时间代码生成属性。
[!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 项目
- 在解决方案资源管理器中,右键单击你的项目,选择添加,然后选择现有项(图 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。 在此示例中,我们创建了名为 Direct3DGame1!1.pgc 的 .pgc 文件。在创建 .pgc 文件时,我们通常使用约定 titlename!#.pgc,其中 titlename 是正在运行的游戏名称,而 # 等于你先前创建的 titlename!#.pgc 文件数加 1。 每次运行 pgosweep.exe 都会创建一个单独的 .pgc 文件。理想情况下,你会创建大量代表各种以性能为中心的场景的 .pgc 文件。完成 .pgc 文件的创建后,你可以在主机(即 SystemScratch)的 D:\ 目录中看到它们,类似图 7。 图 7. 顺序命名的 .pgc 文件。 接下来,你需要将 .pgc 文件合并为另一种称为 .pgd 文件的 PGO 项目。.pgd 文件由编译器在 PGO 的最后阶段(优化阶段)使用。 在开始优化之前,请使用 xbcp.exe 将 .pgc 文件从主机复制回你的 PC。.pgc 文件必须复制到你的生成输出目录。(在图 8 中,生成输出目录是 C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release。) 图 8. 将 .pgc 文件复制到生成输出目录。创建优化版本
若要创建优化版本,请将链接时间代码生成属性设置为 Profile Guided Optimization - Update(图 9)。 图 9. 为优化版本设置链接时间代码生成属性。此属性对应于 MSBuild 中的
/LTCG:PGOptimize 链接器开关。XBOX 上使用 PGO 的建议
以上说明概述了在 XBOX 上通过内置 Visual Studio 项目属性使用 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(如前面图 1 所示,将整个程序优化属性设置为 Yes (/GL))。 - 对于链接器,使用
/LTCG(将链接时间代码生成属性设置为 Use Link Time Code Generation (/LTCG),如图 11 所示)。图 11. 设置链接时间代码生成属性。
- 使用
/FASTGENPROFILE或/GENPROFILE生成 PGO 配置文件(图 12)。有关这些开关的详细信息,请参阅 Microsoft Docs 上的 /GENPROFILE, /FASTGENPROFILE (Generate Profiling Instrumented Build)。图 12. 设置用于生成 PGO 配置文件的链接器开关。
- 使用
/USEPROFILE针对一组 PGO 配置文件进行优化(图 13)。有关此开关的详细信息,请参阅 Microsoft Docs 上的 /USEPROFILE (Run PGO in thread safe mode)。图 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 将更新为正确使用工具内存。
