在 Visual Studio 中配置配置文件引导型优化

AGDE 版本 22.2.71 中引入了对配置文件引导型优化的支持。

找到 PGO 设置

在 Solution Explorer 中打开项目设置。

Visual Studio Solution Explorer 当前项目的属性菜单。

图 1:Visual Studio Solution Explorer 窗口。

确保“Platform”设置为某个 Android 配置(例如 Android-arm64-v8a)。

在左侧面板中,依次选择 Configuration Properties > General。查找名为 PGO 的属性组。

显示“General”属性的项目属性对话框,其中突出显示了 PGO 设置

图 2:项目属性对话框。

在项目中启用 PGO 插桩 build

在项目中添加一个名为 Instrumented 的新配置。这是基于您在开发期间用于测试的配置而创建的,它应该是传统优化型 build(只要您保留编译器优化设置,就仍然可以启用额外的调试功能)。

点击“Property Pages”对话框中的 Configuration Manager… 按钮。

“Property Pages”对话框的顶部,显示了“Configuration”和“Platform”下拉菜单,以及“Configuration Manager”按钮

图 3:“Configuration Manager”对话框。

在“Configuration Manager”对话框中,选择 Active solution configuration 下拉菜单,然后选择 <New…>

“Configuration Manager”对话框,其中“Active solution configuration”下拉菜单已打开,并突出显示了“New”选项。

图 4:新建 build 配置。

…然后新建 PGO 插桩配置。

“New Solution Configuration”对话框,显示正在根据现有的发布 build 配置创建新的 PGO 插桩 build 配置

图 5:“New Solution Configuration”对话框。

如需在 PGO 插桩模式下进行构建,以便为游戏生成配置文件,请在 Profile-Guided Optimization Mode 旁边的选项列表中选择 Instrumented

项目属性对话框,已打开“General”设置,其中显示了 PGO 设置,并且“Profile Guided Optimization Mode”已设置为“Instrumented”。

图 6:项目属性对话框,其中突出显示了 PGO 设置。

Profile Guided Optimization Profiles 设置旁边,输入 Android 设备上要写入原始输出配置数据文件的文件夹的路径。通常,这个值应类似于 /data/data/<package name>/cache/,其中 <package name> 是 APK 软件包的完整名称,例如 com.google.sample.tunnel

如需进一步了解其工作原理,请参阅 Clang 文档

将 PGO 插桩配置数据写入设备

PGO 数据通常由 PGO 插桩系统在进程退出时写入设备。在 Android 设备上,应用不会退出,它们永远都是被终止。这意味着默认的“写入磁盘”功能永远不会触发,因而您的应用需要自行写入 PGO 数据。

应用必须明确调用 __llvm_profile_write_file 来将配置数据写入到磁盘。此符号仅在构建 PGO 插桩 build 时可用。为了简化操作,我们建议您在对 __llvm_profile_write_file 进行前向声明时使用以下模式。

#ifdef PGO_INSTRUMENT
extern "C" int __llvm_profile_write_file(void);
#else
extern "C" int __llvm_profile_write_file(void) { return 0; }
#endif

调用此函数会将配置数据写入您之前指定的文件夹。

运行代码以生成配置文件

如要生成配置文件,您需要在目标设备上运行启用 PGO 插桩构建的 APK。当代码达到您满意的程度并触发了对 __llvm_profile_write_file 函数的调用后,应用就会将配置数据写入存储空间。

此时,请将配置文件复制回设备,以供编译器使用。

准备配置数据以供编译器使用

命令行工具 llvm-profdata 在 Android NDK 中是作为 Clang/LLVM 的一部分提供的,单独使用时,该工具可用于准备配置数据文件,以便在对 build 进行配置文件引导型优化期间提供给编译器使用。

AGDE 会为您自动执行此步骤,它会将您添加到项目中的所有配置数据文件合并在一起并使用这些文件(如果项目属性页面中的 Profile-Guided Optimization Mode 设为 Optimized)。

在启用配置文件引导型优化的情况下构建项目

现在,您已经捕获配置文件并将其添加到项目,编译器可以使用这些数据对 build 优化进行微调。

为 PGO 优化型 build 创建一个新的项目配置,以便您仅在需要时以此模式构建项目。

用来基于发布 build 创建 build 配置的“New Solution Configuration”对话框,但这次使用“PGO-Optimized”作为新的 build 配置名称。

图 7:创建新的 PGO 优化型 build 配置。

在项目属性页面中,将 Profile-Guided Optimization Mode 设为 Optimized

项目属性对话框,已打开“General”设置,其中显示 PGO 设置,并且“Profile Guided Optimization Mode”已设为“Optimized”

图 8:将 PGO 优化模式设置为“Optimized”。

从设备中复制文件,并在 Solution Explorer 中将这些文件添加到项目中。您下次构建 PGO 优化型配置时,编译器会提取这些配置数据文件,用于对编译器优化代码的方式进行微调。

您可以使用 adb 或 Android Device Explorer 将配置数据文件从设备复制到您的项目中。

在 AGDE 之外使用配置文件引导型优化

如果您使用的是 AGDE 不支持的构建系统,您可能需要直接修改 build。Clang 的文档介绍了必要的开关:-fprofile-generate-fprofile-use

如果您的游戏使用中间件引擎,请参阅引擎的相关文档,了解如何启用 PGO(如果受支持)。