将 Android 性能调优器集成到您的 Unity 游戏中

1. 简介

上次更新 2023-07-19

为什么要使用 Android 性能调优器?

Android 性能调优器可帮助您大规模测量和优化游戏的帧速率稳定性和图形保真度,从而跨越众多 Android 设备,为每位用户提供最佳体验。Android 性能调优器库(也称为 Tuning Fork)会记录和汇总来自您游戏的实时帧时间信息,以及您自己的游戏注释和保真度参数,并将此数据上传到 Play 管理中心。这将解锁 Android 性能指标中的一套新的指标和见解。

d96f7a32bee6ab59.png

您将构建什么

在本代码实验室中,您将打开一个为 Unity 制作的演示游戏,测试它并将其与 Android 性能调优器集成。在设置和验证 Android 性能调优器正常运行后,我们将展示如何将游戏上传到 Play 商店,以及如何在 Play 管理中心访问 Android 性能调优器提供的新的性能见解。

您将学到什么

  • 如何为您的游戏添加和设置 Android 性能调优器。
  • 如何验证 Android 性能调优器是否正常运行,以及检查 Play 管理中心中显示的见解。

您需要什么

  • 计算机上安装的 Unity 2020 LTS。
  • 连接到计算机的 Android 设备,已启用 开发者选项USB 调试。您将在该设备上运行游戏。
  • Google 开发者帐户,以及访问 Play 管理中心 以上传您的游戏并查看 Android 性能指标。

2. 使用 Unity 打开 Boat Attack

从 GitHub 获取 Boat Attack

请按照以下步骤操作

  • 确保已安装 git lfs
  • 使用命令行(或您喜欢的 Git 客户端)克隆 Git 仓库:git clone https://github.com/Unity-Technologies/BoatAttack.git
  • 使用命令行检出与您的 Unity 版本相对应的分支:git checkout release/2020.3-LTS

使用 Unity 2020 LTS 打开 Boat Attack

打开 Unity Hub 并选择打开 > 从磁盘添加项目

选择您解压缩存档或克隆 Git 仓库的文件夹。

该项目将被添加到项目列表中。选择 Unity 2020 LTS 的安装作为与该项目一起使用的 Unity 版本。本代码实验室已使用 Unity 2020 LTS 进行测试。其他版本的 Unity 可能需要本代码实验室未涵盖的其他工作。

单击“编辑器版本”列中的 BoatAttack Unity 编辑器版本。选择您安装的 Unity 2020 LTS 版本,然后选择Android 作为平台。您以后可以切换到其他平台,但 Unity 需要重新导入所有资产,这可能需要一些时间。

ec94231ea4f07433.png

当您为项目选择了 Android 平台后,单击该项目以打开它。如果您被要求降级或升级项目,则表示您的 Unity 版本与创建项目时使用的版本不同。

当 Unity 启动时,您会看到带有欢迎窗口的编辑器

ee2046703c176f89.png

关闭游戏玩法成分提示窗口。在 Boat Attack 欢迎窗口中,选择打开 main_menu。然后也可以关闭此窗口。如果您没有看到此窗口,请单击文件 > 打开场景,然后导航到资产 > 场景 > main_menu.unity

如果要查看游戏的运行情况,请单击播放按钮

6bdbbfcae30e0d20.png

单击竞速

702d63eecdd35e77.png

单击旁观者

d9c791977f87de76.png

单击竞速

376fa3bc1b05e793.png

等待游戏加载。游戏将在编辑器中运行。因为这是一个演示,所以船由 AI 控制。

6ff0d453dab5c047.png

现在您已打开游戏并在计算机上运行它,让我们尝试在 Android 设备上运行它,然后添加 Android 性能调优器。

3. 在设备上尝试游戏

在集成 Android 性能调优器之前,最好先熟悉游戏并在 Android 设备上运行它。

打开构建设置

文件菜单中,选择构建设置。在“平台”下,选择Android。然后单击切换平台

cf673361789a85ca.png

如果未选择 Android,Unity 将为 Android 重新导入资产,这可能需要一些时间。

从构建中删除演示场景

为了缩减游戏大小和构建时间,我们将从构建中删除 demo_Island 场景。清除 demo_island 场景的复选框。

f9182897009ffd37.png

默认情况下,main_menu 和 level_Island 场景包含在内。确保 main_menu 场景的值为 0;否则,将其拖放到列表的顶部。

确保 arm64 架构已启用

为了确保游戏在具有 64 位处理器的 Android 设备上以最高速度运行,请确保游戏二进制文件使用对 arm64 的支持构建。打开播放器设置

fe88f2f93795443c.png

设置将在单独的窗口中显示。在Android 设置下,单击其他设置

83d79d8645fb4916.png

向下滚动设置。在目标架构下,确保选中ARM64 和 ARMv7复选框

7e5a3abd08ef4524.png

现在您可以关闭此窗口。

构建可寻址资源

在构建游戏之前,您需要构建 Unity 可寻址资源。

打开窗口 > 资产管理 > 可寻址资源 > 组

7e88d1ad2e311b2.png

可寻址资源组窗口中,选择构建 > 新建构建 > 默认构建脚本

8e99361cafa3bc10.png

等待 Unity 构建可寻址资源资产。

完成后,您就可以在 Android 手机上构建并运行游戏了。

构建并运行游戏

将您的 Android 设备连接到计算机,并确保已打开构建设置窗口。确保您的设备已启用开发者选项和 USB 调试

连接后,您可以单击刷新按钮 *—*(位于运行设备下拉菜单旁边)*—*,然后单击下拉菜单并找到您的设备。

f0a02de254b3589c.png

确认设备已正确连接后,您可以选择默认设备选项。

单击构建并运行按钮。系统会询问您将生成的 APK 文件保存在计算机上的哪个位置。选择一个文件夹并输入一个名称,例如“BoatAttackDemo”。

果游戏无法构建,请转到Unity > 首选项 > 外部工具,并检查所有 Android 工具是否已安装,以及是否显示任何警告

8fcdacc20208f57d.png

Unity 现在将编译游戏。这可能需要一些时间。最后,游戏将安装在您的设备上并启动。

4. 获取 Android 性能调优器的 API 密钥

在 Google Cloud Platform 上启用“Android 性能参数 API”

在将 Android 性能调优器集成到您的项目中之前,您需要获取它的 API 密钥。Android 性能调优器将向 Google Play 管理中心 API 发送性能数据,该 API 必须能够识别您的游戏。

  1. 在 Cloud Console 中创建一个新的 Cloud 项目:
  2. 输入 Cloud 项目的名称,然后单击创建
  3. 在“市场”中搜索“Android 性能参数 API”。
  4. 启用该 API。

创建 API 密钥

库已启用,现在让我们创建 API 密钥

  1. 从菜单中转到API 和服务,然后转到凭据
  2. 单击创建凭据,然后选择API 密钥
  3. 在创建的 API 密钥窗口中,复制密钥的值,并将其存储在安全的位置。
  4. 单击限制密钥
  5. 输入密钥的名称。选择一些可以提醒您它与您的游戏和 Android 性能调优器相关联的名称(例如,带有性能调优器 API 密钥的 BoatAttack)。 d63812118a0bd069.png
  6. API 限制下,选择限制密钥并选择Android 性能参数 API6d23b08d636689ca.png
  7. 单击保存以完成。

现在您已拥有 API 密钥,请将其复制并保存在某个位置,因为您需要它来设置 Android 性能调优器 Unity 插件。

5. 添加和设置 Android 性能调优器

现在您将在游戏中安装 Android Performance Tuner Unity 插件。

下载并安装插件

从 GitHub 下载 Android Performance Tuner Unity 插件并将其保存到计算机上的某个位置。

选择 .unitypackage 文件,用于 android-performance-tuner。确保版本号为 1.5.0 或更高。此文件是 Unity 包,您可以在项目中导入它。在 Unity 的 **Assets** 菜单中,选择 **Import Package > Custom Package...**

729bde4c222e5bbb.png

选择您刚刚下载的 unitypackage 文件。如果询问要导入哪个文件,请选择导入所有文件。

设置 API 密钥并探索插件配置

安装 Android Performance Tuner 插件后,您可以从 **Window > Android Performance Tuner > Setup** 菜单项打开其配置。

124e133ff8a1dafe.png

窗口中显示的第一个选项卡包含一个 API 密钥字段。在此处粘贴您的 API 密钥

c2044acbf4d82402.png

其他选项卡允许您指定注释和保真度参数。

  • 注释提供了有关录制帧时游戏正在执行的操作的上下文信息(例如,当前级别、场景是否正在加载或您认为相关的任何其他状态)。
  • 保真度参数是可以修改以调整游戏质量的参数。例如,这可以是 3D 模型的细节级别、纹理分辨率、游戏渲染分辨率、屏幕上的粒子数量等等。

在此代码实验室中,您不会定义任何自定义注释或保真度参数。Android Performance Tuner Unity 插件将记录当前场景名称作为注释,以及 Unity 设置中定义的活动质量设置作为保真度参数。

启用优化 Android 帧步进和 VSync

打开 **Player Settings**(从 **Build Settings** 窗口)。

在 **Settings for Android** 的 **Resolution and Presentation** 部分中,确保启用 **Optimized Frame Pacing**

ef3cdd3ac05b2cd.png

这将为您的游戏启用 Android 帧步进库。Android Performance Tuner 将使用它来衡量游戏的性能,包括比您不选择此选项时 Unity 单独报告的更深入的衡量指标。

从 **Player Settings** 中,选择 **Quality** 选项卡并找到 **VSync Count** 菜单。使用任何选择(除了 **Don't Sync**)。这将与 Android 帧步进库一起启用更精确的测量。

cdd682549368591b.png

在您的游戏中初始化 Android Performance Tuner

要使 Android Performance Tuner 能够检测您的游戏并将其收集的数据发送到 Play Console API,您需要对其进行初始化。您将通过创建一个名为 GamePerformanceManager 的新脚本执行此操作。您将使用现有的 **AppSettings** 脚本调用 GamePerformanceManager 并在启动时初始化 Android Performance Tuner。

  1. 在 **Project** 选项卡中,导航到 **Scripts > GameSystem**。

    3f74634497ec53be.png
  2. 单击 + 按钮并选择 **C# Script**。

    3b45e8b3012d927b.png
  3. 输入 GamePerformanceManager 作为脚本名称:d68dd365e72a0f1a.png
  4. 双击 GamePerformanceManager 脚本。在内部,实例化 AndroidPerformanceTuner 并创建一个 Initialize 方法。此方法通过调用其 Start 方法来初始化库。将以下所有代码复制到新类中
using Google.Android.PerformanceTuner;
using System.Collections;
using UnityEngine;

public class GamePerformanceManager
{
    AndroidPerformanceTuner<FidelityParams, Annotation> tuner =
        new AndroidPerformanceTuner<FidelityParams, Annotation>();

    public IEnumerator Initialize()
    {
        yield return new WaitForEndOfFrame(); // Needed to make sure Vulkan backend is fully ready, after the first frame.
        ErrorCode startErrorCode = tuner.Start();
        Debug.Log("Android Performance Tuner started with code: " + startErrorCode);

        tuner.onReceiveUploadLog += request =>
        {
            Debug.Log("Telemetry uploaded with request name: " + request.name);
        };
    }
}
  1. 打开 **AppSettings** 脚本。您将使用它来实例化 GamePerformanceManager 并调用其 Initialize 方法。添加一个私有 gamePerformanceManager 字段并添加 Start 方法以调用其 Initialize 方法
using System;
// ...

namespace BoatAttack
{
    [ManagerDefaultPrefab("AppManager")]
    public class AppSettings : Manager
    {
        // ...
        private GamePerformanceManager gamePerformanceManager = new GamePerformanceManager();
        
        // ...
        public IEnumerator Start()
        {
            yield return StartCoroutine(gamePerformanceManager.Initialize());
        }

        // ...
  1. 这足以使 Android Performance Tuner 启动并检测您的游戏。我们添加了在 Android Performance Tuner 启动和遥测上传到 Google Play Console API 时记录日志,以便更容易验证 Android Performance Tuner 是否有效。

减少遥测上传之间的间隔以进行测试

由于我们仍在项目中实现库,因此最好缩短遥测上传之间的间隔。默认情况下,此时间设置为一个较大的间隔,这样游戏就不会向 API 发出太多请求,这对没有包含无限数据的移动数据套餐的用户尤其重要。这也避免了耗尽电池电量。

在这个代码实验室中,您可以缩短此间隔,以便更容易验证遥测是否已正确上传。

  1. 通过单击菜单中的 **Window > Android Performance Tuner > Setup** 打开 Android Performance Tuner 设置。
  2. 选择 **Instrumentation Settings**,然后单击 **Use advanced settings**。
  3. 在 **Intervals (minutes)** 字段中输入 0.51fd3b402d319e5ac.png

这将使 Android Performance Tuner 每 30 秒上传一次遥测。

您现在已经在游戏中集成了 Android Performance Tuner,并对其进行了设置和初始化。在下一节中,我们将通过在设备上运行游戏并检查日志来确认正确的集成。

6. 验证 Android Performance Tuner 的正确集成

检查 Android Performance Tuner 是否已正确启动

要确认 Android Performance Tuner 是否已正确集成,请将您的设备连接到计算机,然后构建并运行游戏。在 Unity 中,选择 **File > Build And Run**。确保 Android 被选为当前平台;否则,在 **Build Settings** 中切换到它。

当游戏在您的手机上启动时,在您的计算机上打开一个终端并启动 adb logcat

adb logcat

等待游戏编译并在您的设备上运行。

在 adb logcat 的输出中,搜索 TuningForkTuning Fork 是 Android 库的内部名称)

02-03 16:55:45.103 10511 10536 I TuningFork: Got settings from tuningfork/tuningfork_settings.bin
02-03 16:55:45.103 10511 10536 I TuningFork: Using local file cache at /data/user/0/com.Unity3d.BoatAttackDay/cache/tuningfork
02-03 16:55:45.105 10511 10536 I TuningFork: OpenGL version 3.2
02-03 16:55:45.105 10511 10536 I TuningFork: TuningFork.GoogleEndpoint: OK
02-03 16:55:45.106 10511 10611 I TuningFork: Creating directory /data/user/0/com.Unity3d.BoatAttackDay/cache/tuningfork
02-03 16:55:45.106 10511 10536 I TuningFork: TuningFork Settings:

[...]

02-03 16:55:45.107 10511 10536 I TuningFork: TuningFork initialized
02-03 16:55:45.107 10511 10536 I UnityTuningfork: Swappy backend: 1
02-03 16:55:45.107 10511 10536 I TuningFork: Creating directory /data/user/0/com.Unity3d.BoatAttackDay/cache/tuningfork/V1
02-03 16:55:45.110 10511 10613 I TuningFork: OpenGL version 3.2
02-03 16:55:45.110 10511 10613 I TuningFork:Web: Connecting to: https://performanceparameters.googleapis.com/v1/applications/com.Unity3d.BoatAttackDay/apks/1:generateTuningParameters

如果您在设置 Android Performance Tuner 时出错,例如忘记设置 API 密钥,您应该在初始化日志中看到错误。例如

02-03 16:49:44.970  8815  8831 I TuningFork: Got settings from tuningfork/tuningfork_settings.bin
02-03 16:49:44.971  8815  8831 I TuningFork: Using local file cache at /data/user/0/com.Unity3d.BoatAttackDay/cache/tuningfork
02-03 16:49:44.972  8815  8831 I TuningFork: OpenGL version 3.2
02-03 16:49:44.972  8815  8831 W TuningFork.GE: The API key in Tuning Fork TFSettings is invalid
02-03 16:49:44.972  8815  8831 E TuningFork: TuningFork.GoogleEndpoint: FAILED
02-03 16:49:44.973  8815  8831 I Unity   : Tuningfork started with code: BadParameter

检查 Android Performance Tuner 是否正在上传遥测

如果您在日志中看到 TuningFork initialized,请多等一会儿并查找指示遥测正在上传的日志

02-03 16:58:00.552 10511 10611 I TuningFork:Web: Connecting to: https://performanceparameters.googleapis.com/v1/applications/com.Unity3d.BoatAttackDay/apks/1:uploadTelemetry
02-03 16:58:00.898 10511 10611 I TuningFork:Web: Response code: 200
02-03 16:58:00.898 10511 10611 I TuningFork:Web: Response message: OK
02-03 16:58:00.899 10511 10611 I TuningFork.GE: UPLOAD request returned 200 {}

在日志中搜索 Connecting to,并在几行之后搜索响应代码。

现在我们已经确认 Android Performance Tuner 正在运行并可以正确上传游戏中的数据,我们将添加一个游戏内注释,以告知 Android Performance Tuner 游戏何时正在加载。这将避免在此时录制性能 - 预计性能会很差。然后我们将构建游戏并将其上传到 Play 商店,将其分发给测试人员并验证 Play Console 的 **Vitals** 部分中是否显示了见解。

7. 添加加载时间记录功能

记录游戏何时执行 **加载事件** 非常重要,原因有两个

  1. 避免在加载时污染您的帧时间数据。
  2. 分析加载时间以查看加载时间何时以及在何处超过可接受的时间。

加载事件可以具有关联的注释(以与帧时间注释相同的方式定义)和 **元数据**。由于用户看到的单个加载周期可能包含多个加载事件,因此所有加载事件都必须属于加载组。一次只能有一个加载组处于活动状态。加载组和事件由句柄标识,这些句柄由 Stop 函数用于结束录制。

  1. GamePerformanceManager 中创建一个新的公共方法,名为 StartRecordingLoadingGroup
public class GamePerformanceManager
{
    // ...

    public ulong StartRecordingLoadingGroup()
    {
        LoadingTimeMetadata groupMetadata = new LoadingTimeMetadata()
        {
            state = LoadingTimeMetadata.LoadingState.InterLevel,
            source = LoadingTimeMetadata.LoadingSource.UnknownSource
        };
        // The metadata and annotation are currently not used by the
        // Play backend but only the annotation can be set to null.
        Result<ulong> result = tuner.StartLoadingGroup(groupMetadata, null);
        return result.value;
    }

  1. GamePerformanceManager 中创建一个新的公共方法,名为 StartRecordingLoadingEvent
public class GamePerformanceManager
{
    // ...

    public ulong StartRecordingLoadingEvent(int sceneIndex)
    {
        LoadingTimeMetadata sceneLoadingMetadata = new LoadingTimeMetadata()
        {
            // Any fields that aren't relevant to your needs can be zero.
            state = LoadingTimeMetadata.LoadingState.InterLevel,
            source = LoadingTimeMetadata.LoadingSource.UnknownSource,
            compression_level = 0,
            network_connectivity = 0,
            network_transfer_speed_bps = 0,
            network_latency_ns = 0
        };
        Annotation annotation = new Annotation() {Scene = (Scene) (sceneIndex + 1)};
        // Start recording loading time.
        Result<ulong> result = tuner.StartRecordingLoadingTime(sceneLoadingMetadata, annotation);
        return result.value;
    }
  1. GamePerformanceManager 中创建一个新的公共方法,名为 StopRecordingLoadingEvent
public class GamePerformanceManager
{
    // ...

    public void StopRecordingLoadingEvent(ulong handle)
    {
        tuner.StopRecordingLoadingTime(handle);
    }

录制事件将在下次会话刷新时上传。

  1. GamePerformanceManager 中创建一个新的公共方法,名为 StopRecordingLoadingGroup
public class GamePerformanceManager
{
    // ...

    public void StopRecordingLoadingGroup(ulong handle)
    {
        tuner.StopLoadingGroup(handle);
    }
  1. 打开 AppSettings 脚本,您之前已在其中添加了 GamePerformanceManager 字段并调用了其 Initialize 方法。
  2. 添加两个 ulong 变量,它们将存储加载组和加载事件的句柄。
using System;
// ...

namespace BoatAttack
{
    [ManagerDefaultPrefab("AppManager")]
    public class AppSettings : Manager
    {
        // ...
        public ulong groupHandle;
        public ulong eventHandle;
  1. 找到 LoadScene(int buildIndex, LoadSceneMode mode) 方法,并在其中添加对 StartRecordingLoadingGroupStartRecordingLoadingEvent 的调用。将它们的结果保存到对应的句柄中。然后,找到 CleanupLoadingScreen 方法,并在其中添加对 StopRecordingLoadingEventStopRecordingLoadingGroup 的调用,并传入存储的句柄。
using System;
// ...

namespace BoatAttack
{
    [ManagerDefaultPrefab("AppManager")]
    public class AppSettings : Manager
    {
        // ...
        public static void LoadScene(int buildIndex, LoadSceneMode mode)
        {
            Instance.groupHandle = Instance.gamePerformanceManager.StartRecordingLoadingGroup();
            Instance.eventHandle = Instance.gamePerformanceManager.StartRecordingLoadingEvent(buildIndex);
            // ...
        }

        // ...

        private void CleanupLoadingScreen()
        {
            Instance.gamePerformanceManager
                .StopRecordingLoadingEvent(Instance.eventHandle);
            Instance.gamePerformanceManager
                .StopRecordingLoadingGroup(Instance.groupHandle);
            // ...
        }

这样,Android 性能调优器就能知道何时发生了加载事件。在加载事件期间,不会记录帧时间。

现在,您可以构建游戏并将其上传到 Play 商店,分发给测试人员,并验证 Play 管理中心的“关键指标”部分是否显示了相关信息。

8. 使用监控应用可视化数据(可选)

监控应用是 Android 游戏 SDK 的一部分。您可以将 Android 性能调优器收集的性能数据重定向到设备上运行的此应用,以便实时查看收集到的数据。它是一个实用的调试工具。

构建监控应用

监控应用必须在使用之前构建。请确保您已安装 Android Studio。如果没有,请从 Android 开发人员网站下载最新版本。

您还需要下载 Android 游戏 SDK 的源代码。请确保您已安装 git 客户端(git 命令行或 GUI 客户端)。

克隆游戏 SDK 的内容

git clone https://android.googlesource.com/platform/frameworks/opt/gamesdk

编译监控应用。打开 Android Studio。在欢迎窗口中,选择**导入项目(Gradle、Eclipse ADT 等)**。

27d916394474814a.png

导航到创建的 gamesdk 文件夹。选择 **src** > **tuningfork** > **tools** > **TuningForkMonitor**。

16454af85bdea995.png

Android Studio 将打开该项目。

786ced03c12d587e.png

该应用是 Kotlin Android 应用。如果您有兴趣使用 Kotlin 在 Android 上开发应用,请在 Android 开发人员网站上了解更多信息

等待项目同步。连接您的设备,然后点击运行按钮。运行按钮显示在顶部工具栏中设备名称旁边。

496c4669bf2cfe86.png

该应用现在将在设备上运行,并等待来自游戏的连接。

1b06081cbff3fc12.png

现在,您需要略微修改游戏配置,以连接到此监控应用。

设置游戏以连接到本地监控应用

现在让我们构建 Unity 中的游戏,使其连接到监控应用。

GamePerformanceManagerInitialize 方法中,在 tuner.Start() 之前添加一行以启用本地端点:tuner.EnableLocalEndpoint()

using Google.Android.PerformanceTuner;
using UnityEngine;

public class GamePerformanceManager
{
    // ...

    public IEnumerator Initialize()
    {
        yield return new WaitForEndOfFrame(); // Needed to make sure Vulkan backend is fully ready, after the first frame.
        tuner.EnableLocalEndpoint(); // For local testing.
        ErrorCode startErrorCode = tuner.Start();
        // ...
    }
}

以开发版本构建游戏

现在,您需要使用以下方法构建并运行游戏

  • 开发版本选项
  • AndroidManifest.xml 文件中启用明文 http 通信

要启用 http 通信,请在您的 项目资源中创建一个名为 Plugins 的文件夹,并在其中创建一个名为 Android 的文件夹。

16c9133cfedf5828.png

3d3ce146436f7cf1.png

在此文件夹中创建一个名为 AndroidManifest.xml 的新文件。在该文件中,粘贴以下内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools">
  <application android:usesCleartextTraffic="true" android:isGame="true">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
  </application>
</manifest>

该文件中的大部分内容是 Unity 生成的默认元素。上面的代码在 application 元素中添加了 android:usesCleartextTraffic="true",以指示您希望您的应用使用明文 HTTP。

现在,您可以再次打开 构建设置窗口。选中 开发版本

159fe8314cd8f61a.png

点击 构建并运行以在您的设备上构建并启动游戏。确保 Tuning Fork Monitor 应用正在运行。

从监控应用中检查性能数据

游戏启动后,请确保运行它一分钟,以便获得一些报告数据。在日志中检查您是否看到 localhost:9000(设备上运行的本地服务器的地址)已报告。

05-14 14:03:26.226 11087 11170 I TuningFork:Web: Connecting to: http://localhost:9000/applications/com.Unity3d.BoatAttackDay/apks/1:uploadTelemetry
[...]
05-14 14:03:26.323 11087 11170 I TuningFork:Web: Response code: 200
05-14 14:03:26.323 11087 11170 I TuningFork:Web: Response message:
05-14 14:03:26.323 11087 11170 I TuningFork.GE: UPLOAD request returned 200{}

从游戏切换到设备上的监控应用,您将在应用列表中看到该游戏。

b5670b4161f29d38.png

点击应用的包名,以查看帧速率直方图和其他设置。

3b760aa953f92a70.png

这确认了 Android 性能调优器集成的正常工作。

9. 构建游戏并将其上传到 Play 商店(可选)

游戏已正确集成了 Android 性能调优器。现在,您可以创建一个新的版本并将其上传到 Play 管理中心。然后,您可以将其分发给测试人员,以开始收集性能数据。

为游戏设置唯一的包名

每个 Android 应用都有一个唯一的应用 ID,它看起来像 Java 包名,例如 com.example.myapp。此 ID 在设备上以及 Google Play 商店中唯一地标识您的应用。如果您已经发布或上传了游戏到 Play 管理中心,那么您已经为其选择了一个包名。

在本 Codelab 中,我们使用的是 Boat Attack 演示游戏。要能够将其上传到您的帐户,您需要选择一个新的、唯一的应用 ID。

打开 播放器设置(从构建设置窗口)。在 Android 选项卡中,打开 其他设置部分,找到 包名字段。

b2fbdfb3da24e216.png

输入一个唯一、有效的应用 ID。

为游戏创建和设置密钥库

Android 要求所有应用使用证书进行数字签名,然后才能将其安装在设备上或进行更新。

在本 Codelab 中,我们将为游戏创建一个 密钥库。如果您要发布现有游戏的更新,请重新使用与发布应用的先前版本相同的密钥库。

创建密钥库

您可以使用 Android Studio 创建密钥库,也可以在命令行中生成密钥库。使用命令行,导航到要存储密钥的文件夹,然后运行 keytool

keytool -genkey -v -keystore mykeystore.keystore -alias alias -keyalg RSA -keysize 2048 -validity 10000

回答有关您身份的问题,并在被询问详细信息是否正确时输入 yes 确认。您需要输入密码和别名密码。

在 Unity 中设置密钥库

现在,您拥有了密钥库,请导航到 播放器设置(从构建设置窗口)。在 Android 选项卡中,打开 发布设置部分。选中 自定义密钥库,然后选择您的密钥库文件。输入用于密钥库的密码、别名名称和别名密码。这些是在使用 Android Studio 或 keytool 命令行工具创建密钥库时选择的。请注意,keytool 命令对密钥库和别名使用相同的密码,这在 Codelab 中是可以接受的,但对于生产应用来说是不可取的。

6fe0ff80fb8d6bfe.png

隐私

请查看您的应用的隐私政策,以确保它正确地反映了可能与 Google 共享的有关设备和使用情况的数据。根据 Google API 服务条款 第 3.b 节,该条款规定了您对 Android 性能调优器 API 的使用,您必须

“遵守所有适用的隐私法律和法规,包括适用于个人身份信息的法律和法规。您将为您的 API 客户端提供并遵守一项隐私政策,该政策清楚、准确地向您的 API 客户端的用户描述您收集哪些用户信息以及您如何使用和共享此类信息(包括用于广告)与 Google 和第三方。”

修改游戏以将捆绑包大小保持在 Play 商店的 200 MB 限制内

从构建中删除演示场景

从构建中删除 demo_Island 场景。如果您之前没有这样做,请返回 构建设置窗口,取消选中 demo_island 场景的复选框,并确保 main_menu 和 level_island 已选中。还要确保 main_menu 的值为 0。如果没有,请将其拖放到列表顶部。

f9182897009ffd37.png

减少纹理使用的数据

构建设置中,将 纹理压缩设置为 ASTC

b2b5aaa8fe1fea92.png

覆盖 Interceptor 和 Renegade 艇的 AlbedoAO、MSLL 和 Normal 文件的纹理设置,使其 最大尺寸512

e962c21e215e4c76.png

以 Android 应用捆绑包形式构建游戏

游戏已接近完成。我们不会构建并提交 APK 文件到 Play 商店,而是将构建 Android 应用捆绑包。当您上传 Android 应用捆绑包时,Google Play 能够自动构建和提供针对每个设备配置优化的 APK。这意味着您的用户需要下载和安装到手机上的 游戏更小

以 Android 应用捆绑包形式上传的游戏还可以受益于 200 MB 的大小限制。它高于单个传统 APK 的默认限制 100 MB。这将对本 Codelab 有用,因为即使只有一个演示场景,游戏也超过了 100 MB。

构建设置窗口中,选中 构建应用捆绑包(Google Play)

b8992811a96f3ca9.png

这只需要生成 Android 应用捆绑包(一个 .aab 文件)。

构建游戏

游戏应该已准备就绪!在 构建设置窗口中,确保未选中开发版本,然后点击 构建。选择 Android 应用捆绑包文件的存储位置。

检查您是否已完成所有步骤

在将 Android 应用捆绑包 (.aab 文件) 上传到 Play 管理中心之前,请检查您是否已

  • 启用了优化的 Android 帧速率调整
  • 记录了加载时间(强烈建议)
  • 使用 logcat 验证了集成
  • 如果您要将游戏发布给用户或测试人员:请根据需要查看和更新您的隐私政策
  • 确认您或其他相关的游戏工程师有权访问 Play 管理中心的 Android 关键指标。

如果您决定使用自定义保真度参数或自定义注释(除了关卡名称和加载状态之外),请确保您已在插件设置中添加了它们,并使用 AndroidPerformanceTuner 将它们集成到您的游戏中,就像您对加载注释所做的那样。

上传游戏并在内部测试轨道上创建发布版

使用 Google Play Console 创建一个应用,填写有关它的信息,并创建一个新的 **内部测试版发布**. 将您的 Android App Bundle 上传到此 **内部测试版发布**. 这将允许您测试您的应用并在 Play Console 中查看结果。

请注意,使用 **内部测试** 版发布来测试您对 Android Performance Tuner 的集成非常重要。您可以发布到其他轨道(封闭测试、公开测试或生产),但您需要大量的用户玩您的游戏才能在 Play Console 中看到数据。

10. 在 Google Play Console 中可视化结果和见解(可选)

打开 Android Vitals 页面

打开 Google Play Console 并选择您已上传的应用。在菜单中,选择 **Android Vitals** > **性能 > 帧率** 在 **质量** 部分

97d8258ca22a94a.png

如果您在提交应用以供测试后立即打开页面,它可能会为空,因为尚未收到和聚合任何数据

cb03a440ecbf9ccf.png

确保您的游戏已播放,以便数据流入。由于它只是一个演示,您可以在几台设备上运行它。

您已经可以为您的游戏设置目标帧率 - 使见解能够适应您游戏预期性能。在本示例中,我们将将其设置为 30fps。这是默认值,因此我们只需单击 **Dismiss**。

探索 Android Vitals 页面中的结果

在一定数量的用户玩过您的游戏后,您将能够看到显示游戏性能的图表。

通过在页面顶部选择它,确保您查看的是应用的正确版本的数据

210fea23c940f105.png

**摘要** 部分显示了已记录的会话数量,以及这些会话中被认为缓慢的帧数

415a8592b6027857.png

**见解** 部分显示了更多详细信息,其中 **设备型号问题** 部分列出了每个设备型号的缓慢帧,**注释问题** 部分列出了每个注释的缓慢帧

b6bb81a2043fb90d.png

下一部分允许您在图表中探索数据

63ae373acebd2cda.png

每个设备型号的帧时间的第 90 个百分位数都在这里表示,按质量级别排序。在此代码实验室中,我们只有一个质量级别,它由 Android Performance Tuner 自动从 Unity 质量级别映射。

有关如何了解您的性能指标和见解的更多信息,请参阅 了解 Android Performance Tuner 见解

11. 恭喜

恭喜您已成功将 **Android Performance Tuner** 添加到游戏中,验证了集成并检查了 Google Play Console 上的结果。

当您将游戏推出到玩家手中时,请关注见解,以识别存在问题的设备或确定添加到游戏中的潜在改进。

下一步是什么?