1. 简介
上次更新时间 2023-07-19
为何使用 Android Performance Tuner?
借助 Android Performance Tuner,您可以大规模地衡量和优化游戏在众多 Android 设备上的帧率稳定性和图形保真度,从而为每位用户提供最佳体验。Android Performance Tuner 库(也称为 Tuning Fork)会记录并汇总游戏的实时帧时间信息以及您自己的游戏注释和保真度参数,并将这些数据上传到 Play 管理中心。这将在 Android vitals 中提供一套新的指标和洞察。
您将构建的内容
在本 Codelab 中,您将打开为 Unity 构建的演示游戏,对其进行测试,然后集成 Android Performance Tuner。在设置并验证 Android Performance Tuner 正常工作后,我们将介绍如何将游戏上传到 Play 商店并在 Play 管理中心获取 Android Performance Tuner 提供的新性能洞察。
您将学到的内容
- 如何为您的游戏添加和设置 Android Performance Tuner。
- 如何验证 Android Performance Tuner 是否正常工作,以及检查 Play 管理中心显示的洞察。
您需要准备什么
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,然后选择 Open > Add project from disk
选择您解压缩或克隆 Git 代码库的文件夹。
该项目将被添加到项目列表中。选择安装的 Unity 2020 LTS 作为该项目使用的 Unity 版本。本 Codelab 使用 Unity 2020 LTS 进行测试。其他版本的 Unity 可能需要本 Codelab 未涵盖的其他工作。
在“Editor Version”列中点击 BoatAttack Unity 编辑器版本。选择您安装的 Unity 2020 LTS 版本,然后选择 Android 作为平台。您以后可以切换到其他平台,但 Unity 将需要重新导入所有素材资源,这可能需要一些时间。
为项目选择了 Android 平台后,点击该项目将其打开。如果您被要求降级或升级项目,则表示您的 Unity 版本与创建项目时使用的版本不同。
Unity 启动后,您将看到带有一个欢迎窗口的编辑器
关闭 Gameplay Ingredients 提示窗口。在 Boat Attack 欢迎窗口中,选择 Open main_menu。然后您也可以关闭此窗口。如果您没有看到此窗口,请点击 File > Open Scene,然后导航到 Assets > Scenes > main_menu.unity。
如果您想看到游戏实际运行,请点击播放按钮
点击 Race。
点击 Spectator。
点击 Race。
等待游戏加载。游戏将在编辑器中运行。由于这是演示版,船只由 AI 控制。
现在您已在计算机上打开并运行了游戏,接下来我们尝试在 Android 设备上运行它,然后添加 Android Performance Tuner。
3. 在设备上试玩游戏
在集成 Android Performance Tuner 之前,最好熟悉一下游戏并在 Android 设备上运行它。
打开 Build Settings
在 File 菜单中,选择 Build Settings。在 Platform 下,选择 Android。然后点击 Switch Platform。
如果 Android 未被选择,Unity 将重新导入 Android 的素材资源,这可能需要一些时间。
从构建中移除 demo 场景
为了减小游戏大小和构建时间,我们将从构建中移除 demo_Island 场景。清除 demo_island 场景的复选框。
默认情况下,main_menu 和 level_Island 场景已包含在内。确保 main_menu 场景的值为 0;否则,将其拖放到列表顶部。
确保 arm64 架构已激活
为确保游戏在配备 64 位处理器的 Android 设备上以最高速度运行,请确保游戏二进制文件是使用 arm64 支持构建的。打开 Player Settings
设置显示在单独的窗口中。在 Settings for Android 下,点击 Other Settings
向下滚动设置。在 Target Architectures 下,确保已选择 ARM64 and ARMv7 复选框
现在您可以关闭此窗口。
构建可寻址资源
在构建游戏之前,您需要构建 Unity 可寻址资源。
打开 Window > Asset Management > Addressables > Groups。
在 Addressables Groups 窗口中,选择 Build > New Build > Default Build Script
等待 Unity 构建可寻址资源文件。
完成后,您就可以在 Android 手机上构建并运行游戏了。
构建并运行游戏
将您的 Android 设备连接到计算机,并确保已打开 Build Settings 窗口。确保您的设备已启用开发者选项和 USB 调试。
连接后,您可以点击 Run Device 下拉菜单旁边的 Refresh 按钮 *—*,然后点击下拉菜单并找到您的设备。
确认您的设备已正确连接后,您可以保持选择 Default device 选项。
点击 Build And Run 按钮。系统将询问您要在计算机上的何处保存生成的 APK 文件。选择一个文件夹并输入一个名称,例如“BoatAttackDemo”。
If 游戏无法构建,请依次前往 Unity > Preferences > External Tools,然后检查是否已安装所有 Android 工具并且未显示任何警告
Unity 现在将编译游戏。这可能再次需要一些时间。最后,游戏将安装到您的设备上并启动。
4. 获取 Android Performance Tuner 的 API 密钥
在 Google Cloud Platform 上启用“Android Performance Parameters API”
在将 Android Performance Tuner 集成到您的项目之前,您需要为其获取 API 密钥。Android Performance Tuner 会将性能数据发送到 Google Play 管理中心 API,后者必须能够识别您的游戏。
- 在 Cloud Console 中创建新的 Cloud 项目:
- 输入您的 Cloud 项目的名称,然后点击 Create。
- 在 Marketplace 中搜索“Android Performance Parameters API”。
- 启用该 API。
创建 API 密钥
库已启用,现在我们来创建 API 密钥
- 从菜单中依次转到 API & Services,然后选择 Credentials。
- 点击 Create Credentials,然后选择 API Key。
- 从创建的 API 密钥窗口中,复制密钥的值并将其安全存储起来。
- 点击 Restrict Key。
- 输入密钥的名称。选择一个能让您想起它与您的游戏和 Android Performance Tuner 相关的名称(例如,BoatAttack with Performance Tuner API key)。
- 在 API restrictions 下,选择 Restrict key 并选择 Android Performance Parameters API:
- 点击 Save 完成。
现在您已经拥有 API 密钥,请复制它并将其保存在某处,因为您需要它来设置 Android Performance Tuner Unity 插件。
5. 添加和设置 Android Performance Tuner
您现在将在游戏中安装 Android Performance Tuner Unity 插件。
下载并安装插件
从 GitHub 下载 Android Performance Tuner Unity 插件并将其保存在计算机上的某个位置。
选择 android-performance-tuner
的 .unitypackage
文件。确保版本号为 1.5.0 或更高。此文件是您可以在项目中导入的 Unity Package。在 Unity 的 Assets 菜单中,选择 Import Package > Custom Package...
选择您刚刚下载的 unitypackage 文件。如果系统询问要导入哪个文件,请选择导入所有文件。
设置 API 密钥并浏览插件配置
安装 Android Performance Tuner 插件后,您可以从 Window > Android Performance Tuner > Setup 菜单项中打开其配置。
窗口中显示的第一个标签页包含一个用于填写 API Key 的字段。将您的 API 密钥粘贴到此处
其他标签页允许您指定注释和保真度参数。
- 注释提供记录帧时游戏正在执行的操作的上下文信息(例如,当前关卡、场景是否正在加载,或您认为相关的任何其他状态)。
- 保真度参数是可修改以调整游戏质量的参数。例如,这可以是 3D 模型的细节级别、纹理分辨率、游戏渲染分辨率、屏幕上的粒子数量等。
在本 Codelab 中,您不会定义任何自定义注释或保真度参数。Android Performance Tuner Unity 插件会将当前场景名称记录为注释,并将 Unity 设置中定义的活动质量设置记录为保真度参数。
启用 Optimized Android Frame Pacing 和 VSync
打开 Player Settings(从 Build Settings 窗口中)。
在 Settings for Android 下的 Resolution and Presentation 部分,务必启用 Optimized Frame Pacing
这将为您的游戏启用 Android Frame Pacing 库。Android Performance Tuner 将使用它来衡量游戏的性能,包括与您不选择此选项时 Unity 单独报告的衡量结果相比更深入的衡量。
在 Player Settings 中,选择 Quality 标签页并找到 VSync Count 菜单。使用任意选择(除了 Don't Sync)。这将结合 Android Frame Pacing 库启用更精确的测量。
在游戏中初始化 Android Performance Tuner
要让 Android Performance Tuner 检测您的游戏并将收集到的数据发送到 Play 管理中心 API,您需要对其进行初始化。您将通过创建名为 GamePerformanceManager
的新脚本来完成此操作。您将使用现有的 AppSettings 脚本调用 GamePerformanceManager
并在启动时初始化 Android Performance Tuner。
- 在 Project 标签页中,导航到 Scripts > GameSystem。
- 点击 + 按钮,然后选择 C# Script。
- 输入
GamePerformanceManager
作为脚本名称: - 双击
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);
};
}
}
- 打开 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());
}
// ...
- 这些足以启动 Android Performance Tuner 并检测您的游戏。我们已在 Android Performance Tuner 启动和遥测数据上传到 Google Play 管理中心 API 时添加了日志,以便更轻松地验证 Android Performance Tuner 是否正常工作。
减少遥测数据上传间隔用于测试
由于我们仍在项目中实现库,因此最好减少遥测数据上传之间的时间间隔。默认情况下,此时间设置为一个较大的间隔,以便游戏不会向 API 发送过多请求,这对于没有无限流量移动数据套餐的用户尤其重要。这也可以避免耗尽电池电量。
在本 Codelab 中,您可以缩短此间隔,以便更轻松地验证遥测数据的正常上传。
- 通过依次点击菜单中的 Window > Android Performance Tuner > Setup 打开 Android Performance Tuner 设置。
- 选择 Instrumentation Settings,然后点击 Use advanced settings。
- 在 Intervals (minutes) 字段中输入
0.5
:
这将使 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 的输出中,搜索 TuningFork
(Tuning 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 管理中心的重要指标部分。
7. 添加加载时间记录函数
记录游戏执行加载事件的时间很重要,原因如下
- 避免在加载时污染帧时间数据。
- 分析加载时间,查看何时何地加载时间超出可接受范围。
加载事件可以有一个关联的注释(以与帧时间注释相同的方式定义)和元数据。由于用户看到的单个加载周期可能包含多个加载事件,因此所有加载事件都必须是加载组的一部分。一次只能有一个加载组处于活动状态。加载组和事件由句柄标识,Stop
函数使用这些句柄来结束记录。
- 在
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;
}
- 在
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;
}
- 在
GamePerformanceManager
中创建一个新的公共方法,名为StopRecordingLoadingEvent
public class GamePerformanceManager
{
// ...
public void StopRecordingLoadingEvent(ulong handle)
{
tuner.StopRecordingLoadingTime(handle);
}
记录的事件将在下次会话刷新时上传。
- 在
GamePerformanceManager
中创建一个新的公共方法,名为StopRecordingLoadingGroup
public class GamePerformanceManager
{
// ...
public void StopRecordingLoadingGroup(ulong handle)
{
tuner.StopLoadingGroup(handle);
}
- 打开
AppSettings
脚本,您之前在此处添加了GamePerformanceManager
字段并调用了其Initialize
方法。 - 添加两个
ulong
变量,用于存储加载组和加载事件的句柄。
using System;
// ...
namespace BoatAttack
{
[ManagerDefaultPrefab("AppManager")]
public class AppSettings : Manager
{
// ...
public ulong groupHandle;
public ulong eventHandle;
- 找到
LoadScene(int buildIndex, LoadSceneMode mode)
方法并添加调用StartRecordingLoadingGroup
和StartRecordingLoadingEvent
的代码。将其结果保存到相应的句柄中。然后,找到CleanupLoadingScreen
方法并添加调用StopRecordingLoadingEvent
和StopRecordingLoadingGroup
的代码,传入存储的句柄
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 Performance Tuner 就能够知道加载事件何时正在进行。在加载事件期间,不记录帧时间。
您现在可以构建并将游戏上传到 Play 商店,分发给测试人员,并验证洞察是否显示在 Play 管理中心的“重要指标”部分。
8. 使用监控应用可视化数据(可选)
监控应用是 Android Game SDK 的一个工具。您可以将 Android Performance Tuner 收集的性能数据重定向到在您设备上运行的此应用,以实时查看收集到的内容。这是一个有用的调试工具。
构建监控应用
监控应用在使用前必须先构建。确保您已安装 Android Studio。如果尚未安装,请从 Android 开发者网站下载最新版本
您还需要下载 Android Game SDK 的源代码。确保您已安装 git 客户端(无论是 Git 命令行还是 GUI 客户端)。
克隆 Game SDK 的内容
git clone https://android.googlesource.com/platform/frameworks/opt/gamesdk
编译监控应用。打开 Android Studio。在欢迎窗口中,选择 Import project (Gradle, Eclipse ADT, etc.)。
导航到已创建的 gamesdk 文件夹。选择 src > tuningfork > tools > TuningForkMonitor。
Android Studio 将打开项目
该应用是一个 Kotlin Android 应用。如果您有兴趣使用 Kotlin 开发 Android 应用,请在 Android 开发者网站上详细了解。
等待项目同步。连接您的设备并点击 Run 按钮。Run 按钮显示在顶部工具栏中的设备名称旁边。
应用现在将在设备上运行并等待游戏连接
您现在将稍微修改游戏配置以连接到此监控应用。
设置游戏以连接本地监控应用
现在让我们在 Unity 中构建游戏,使其连接到监控应用。
在 GamePerformanceManager
的 Initialize
方法中,在 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();
// ...
}
}
将游戏构建为开发版本
您现在需要使用以下选项构建并运行游戏
- Development Build 选项
- 在
AndroidManifest.xml
文件中启用明文 http 通信
要启用 http 通信,请在您的 Projects Assets 中创建一个名为 Plugins 的文件夹,然后创建另一个名为 Android 的文件夹
在此文件夹内创建一个名为 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。
您现在可以再次打开 Build Settings 窗口。勾选 Development Build
点击 Build And Run 以在您的设备上构建并启动游戏。确保 Tuning Fork Monitor 应用正在运行。
检查监控应用中的性能数据
游戏启动后,确保运行一分钟以获取一些数据报告。在日志中检查是否看到报告了 localhost:9000(设备上运行的本地服务器地址)。
05-14 14:03:26.226 11087 11170 I TuningFork:Web: Connecting to: https://: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{}
在设备上从游戏切换到监控应用,您将在应用列表中看到游戏
点击应用的软件包名称即可查看帧率直方图和其他设置
这确认了 Android Performance Tuner 集成的正常工作。
9. 构建游戏并将其上传到 Play Store(可选)
游戏已正确集成 Android Performance Tuner。您现在可以创建新构建并将其上传到 Play 管理中心。然后可以将其分发给测试人员以开始收集性能数据。
为游戏设置唯一的软件包名称
每个 Android 应用都有一个唯一的应用 ID,看起来像 Java 软件包名称,例如 com.example.myapp。此 ID 可在设备上和 Google Play 商店中唯一标识您的应用。如果您已经有游戏已发布或上传到 Play 管理中心,则已经为其选择了软件包名称。
在本 Codelab 中,我们使用的是 Boat Attack 演示游戏。为了将其上传到您的账号,您需要选择一个新的、唯一的应用 ID。
打开 Player Settings(从 Build Settings 窗口中)。在 Android 标签页中,打开 Other Settings 部分并找到 Package Name 字段
输入唯一的有效应用 ID。
为游戏创建并设置 Keystore
Android 要求所有应用在安装到设备或更新之前都使用证书进行数字签名。
我们将在本 Codelab 中为游戏创建一个 Keystore。如果您正在发布现有游戏的更新,请重复使用您发布先前版本的应用所使用的 Keystore。
创建一个 Keystore
您可以使用 Android Studio 创建 Keystore,或在命令行生成一个。使用命令行导航到您要存储密钥的文件夹,然后运行 keytool
keytool -genkey -v -keystore mykeystore.keystore -alias alias -keyalg RSA -keysize 2048 -validity 10000
回答有关您的身份的问题,并在系统询问详细信息是否正确时输入 yes
进行确认。您需要输入密码和别名密码。
在 Unity 中设置 Keystore
现在您已拥有 Keystore,导航到 Player Settings(从 Build Settings 窗口中)。在 Android 标签页中,打开 Publishing Settings 部分。勾选 Custom Keystore,然后选择您的 Keystore 文件。输入用于 Keystore 的密码、别名名称和别名密码。这些是您使用 Android Studio 或 keytool 命令行工具创建 Keystore 时选择的密码。请注意,keytool 命令对 Keystore 和别名使用相同的密码,这在本 Codelab 中可以接受,但不建议用于生产应用。
隐私
请检查您的应用隐私政策,确保其充分反映了关于设备和使用情况的数据可能会与 Google 共享。根据《Google API 服务条款》(管理您使用 Android Performance Tuner API 的条款)的第 3 条第 b 款,您必须:
“遵守所有适用的隐私法律法规,包括适用于个人身份信息 (PII) 的法律法规。您将为您的 API 客户端提供并遵守一项隐私政策,该政策应向您的 API 客户端用户清晰准确地描述您收集哪些用户信息以及您如何使用这些信息并将其与 Google 和第三方共享(包括用于广告目的)。”
修改游戏以将软件包大小保持在 Play Store 200MB 的限制以下
从构建中移除 demo 场景
从构建中移除 demo_Island 场景。如果您之前没有这样做,请返回 Build Settings 窗口,清除 demo_island 场景的复选框,并确保 main_menu 和 level_island 都已选中。还要确保 main_menu 的值为 0。如果不是,请将其拖放到列表顶部。
减少纹理占用的数据
在 Build Settings 中,将 Texture Compression 设置为 ASTC。
覆盖 Interceptor 和 Renegade 船只的 AlbedoAO、MSLL 和 Normal 文件的纹理设置,将其 Max Size 设置为 512
。
将游戏构建为 Android App Bundle
游戏几乎已准备就绪。我们将构建一个 Android App Bundle,而不是构建 APK 文件并将其提交到 Play 商店。当您上传 Android App Bundle 时,Google Play 能够自动构建和提供针对每种设备配置优化的 APK。这意味着您的用户需要下载和安装到手机上的游戏大小更小。
上传为 Android App Bundle 的游戏也受益于 200 MB 的大小限制。这高于单个传统 APK 100 MB 的默认限制。这对于本 Codelab 很有用,因为即使只包含演示场景,游戏也大于 100 MB。
在 Build Settings 窗口中,勾选 Build App Bundle (Google Play)。
生成 Android App Bundle(.aab
文件)所需的全部内容就是这些。
构建游戏
游戏应该准备就绪了!在 Build Settings 窗口中,确保 Development Build 未选中,然后点击 Build。为 Android App Bundle 文件选择一个位置。
检查您是否已涵盖所有内容
在将 Android App Bundle(.aab
文件)上传到 Play 管理中心之前,请检查您是否已完成以下操作:
- 启用 Optimized Android Frame Pacing
- 记录加载时间(强烈推荐)
- 使用 logcat 验证集成
- 如果您正在向用户或测试人员发布游戏:根据需要检查并更新您的隐私政策
- 确认您或其他相关游戏工程师已获得 Play 管理中心 Android vitals 的访问权限
如果您决定使用自定义保真度参数或自定义注释(除了关卡名称和加载状态之外),请确保您已将它们添加到插件设置中,并使用 AndroidPerformanceTuner 将它们集成到您的游戏中,就像您对加载注释所做的那样。
上传游戏并在内部测试轨道上创建发布
使用Google Play 管理中心创建应用,填写应用信息,并创建新的内部测试发布。将您的 Android App Bundle 上传到此内部测试发布。这将允许您测试应用并在 Play 管理中心查看结果。
请注意,使用内部测试发布来测试 Android Performance Tuner 的集成非常重要。您可以发布到其他轨道(封闭测试、开放测试或正式版),但您需要大量用户玩您的游戏才能在 Play 管理中心看到数据。
10. 在 Google Play Console 中可视化结果和分析洞察(可选)
打开 Android Vitals 页面
打开Google Play 管理中心并选择您上传的应用。在菜单中,依次选择 Android Vitals > Performance > Frame Rate(位于 Quality 部分)
如果您刚提交应用进行测试后打开页面,由于尚未接收和汇总任何数据,页面可能为空
确保游戏被玩以获取数据流。由于这是一个演示版,您可以让它在几台设备上运行。
您已经可以为游戏设置目标帧率 - 从而根据游戏预期性能调整洞察。在我们的示例中,我们将将其设置为 30fps。这是默认设置,因此我们可以直接点击 Dismiss。
浏览 Android Vitals 页面的结果
在您的游戏被一定数量的用户玩过之后,您将能够看到显示游戏性能图表。
通过在页面顶部选择您的应用版本,确保您查看的是正确版本的数据
Summary 部分显示已记录的会话数量以及这些会话中被认为缓慢的帧数
Insights 部分显示更多详细信息,Device model issues 部分按设备型号显示慢帧,Annotation issues 部分按注释显示慢帧
下一部分允许您以图表形式浏览数据
在此处显示了每个设备型号的第 90 百分位帧时间,按质量级别排序。在本 Codelab 中,我们只有一个质量级别,该级别由 Android Performance Tuner 自动从 Unity 质量级别映射而来。
有关如何理解您的性能指标和洞察的更多信息,请参阅理解 Android Performance Tuner 洞察。
11. 恭喜
恭喜,您已成功将 Android Performance Tuner 添加到游戏中,验证了集成并检查了 Google Play 管理中心的结果。
随着您的游戏向玩家推出,请持续关注洞察以识别存在问题的设备或寻找潜在的改进措施添加到您的游戏中。