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

1. 简介

上次更新 2023-07-19

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

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

d96f7a32bee6ab59.png

您将构建什么

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

您将学到什么

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

您需要什么

  • 已安装在计算机上的 Unity 2020 LTS。
  • 已连接到计算机的 Android 设备,该设备已启用开发者选项USB 调试。您将在该设备上运行游戏。
  • 一个 Google 开发者帐户,以及访问Play Console以上传您的游戏并查看 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 版本。此 Codelab 已使用 Unity 2020 LTS 进行测试。其他版本的 Unity 可能需要此 Codelab 未涵盖的其他操作。

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

ec94231ea4f07433.png

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

Unity 启动后,您将看到带有欢迎窗口的编辑器

ee2046703c176f89.png

关闭游戏玩法要素提示窗口。在 Boat Attack 欢迎窗口中,选择打开 main_menu。然后您也可以关闭此窗口。如果您没有看到此窗口,请单击文件 > 打开场景,然后导航到Assets > Scenes > 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 Console API,这些 API 必须能够识别您的游戏。

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

创建 API 密钥

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

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

现在您已获得 API 密钥,请复制并将其保存在某个位置,因为您需要它来设置 Android Performance Tuner Unity 插件。

5. 添加并设置 Android Performance Tuner

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

下载并安装插件

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

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

729bde4c222e5bbb.png

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

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

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

124e133ff8a1dafe.png

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

c2044acbf4d82402.png

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

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

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

启用优化的 Android 帧速率和 VSync

打开**播放器设置**(从**构建设置**窗口)。

在**Android 设置**的**分辨率和显示**部分下,确保启用**优化帧速率**

ef3cdd3ac05b2cd.png

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

在**播放器设置**中,选择**质量**选项卡,然后找到**VSync 计数**菜单。使用任何选择(除了**不同步**)。这将与 Android 帧速率库结合使用,实现更精确的测量。

cdd682549368591b.png

在游戏中初始化 Android Performance Tuner

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

  1. 在**项目**选项卡中,导航到**脚本 > 游戏系统**。

    3f74634497ec53be.png
  2. 点击 + 按钮,然后选择**C# 脚本**。

    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 发出过多请求,这对于没有包含无限数据套餐的移动数据套餐的用户尤其重要。这也避免了耗电。

在本 Codelab 中,您可以缩短此间隔,以便更容易验证遥测数据的正确上传。

  1. 通过单击菜单中的**窗口 > Android Performance Tuner > 设置**打开 Android Performance Tuner 设置。
  2. 选择**检测设置**,然后单击**使用高级设置**。
  3. 在**间隔(分钟)**字段中输入0.51fd3b402d319e5ac.png

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

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

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

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

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

当您的游戏在手机上启动时,在计算机上打开一个终端并启动 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 的**关键指标**部分中是否显示了见解。

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 Console 的“关键指标”部分中是否显示了洞察信息。

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

点击**构建并运行**以构建并启动设备上的游戏。确保监控应用正在运行。

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

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

05-14 14:03:26.226 11087 11170 I TuningFork:Web: Connecting to: https://127.0.0.1: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 Console。然后,您可以将其分发给测试人员以开始收集性能数据。

为游戏设置唯一的包名称

每个 Android 应用都有一个唯一的应用 ID,它看起来像 Java 包名称,例如 *com.example.myapp*。此 ID 在设备和 Google Play 商店中唯一标识您的应用。如果您已发布或上传到 Play Console 的游戏,则已为其选择了包名称。

在此 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,您必须:

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

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

从版本中删除演示场景

从版本中删除 demo_Island 场景。如果您之前没有执行此操作,请返回到**构建设置**窗口,清除 demo_island 场景的复选框,并确保 main_menu 和 level_island 已选中。还要确保 main_menu 的值为 0。如果未设置,请将其拖放到列表顶部。

f9182897009ffd37.png

减少纹理使用的数据

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

b2b5aaa8fe1fea92.png

覆盖拦截器和叛逆者两艘船的 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 Console 之前,请检查您是否已

  • 启用了优化的 Android 帧速率控制
  • 记录了加载时间(强烈建议)
  • 使用 logcat 验证了集成
  • 如果您要向用户或测试人员发布游戏:根据需要查看并更新您的隐私政策
  • 确认您或其他相关游戏工程师可以访问 Play Console 中的 Android Vitals

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

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

使用Google Play Console创建应用,填写相关信息并创建一个新的内部测试版本。将您的 Android 应用包上传到此内部测试版本。这将允许您测试您的应用并在 Play Console 中查看结果。

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

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

打开 Android Vitals 页面

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

97d8258ca22a94a.png

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

cb03a440ecbf9ccf.png

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

您已经可以为您的游戏设置目标帧率 - 允许 Insights 适应您游戏预期的性能。在我们的示例中,我们将将其设置为 30fps。这是默认值,因此我们只需单击关闭即可。

探索 Android Vitals 页面中的结果

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

请确保您查看的是应用的正确版本的相关数据,方法是在页面顶部选择它。

210fea23c940f105.png

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

415a8592b6027857.png

Insights部分显示了更多详细信息,包括设备型号问题部分中每个设备型号的缓慢帧数以及注释问题部分中每个注释的缓慢帧数。

b6bb81a2043fb90d.png

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

63ae373acebd2cda.png

每个设备型号的帧时间第 90 个百分位数都显示在此处,按质量级别排序。在本 Codelab 中,我们只有一个质量级别,它由 Android Performance Tuner 从 Unity 质量级别自动映射。

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

11. 恭喜

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

随着您向玩家推出游戏,请关注 Insights 以识别存在问题的设备或确定可以添加到游戏中的潜在改进。

下一步是什么?