初始化库并验证操作

本页面介绍了如何在游戏代码中初始化库并验证其是否正在将数据上传到 Google Play。要查找有关特定库功能的更多信息,请参阅参考文档

初始化库

在游戏开始时的初始化方法中,通过实例化 AndroidPerformanceTuner 并调用其 Start() 方法来初始化库

using Google.Android.PerformanceTuner;
using UnityEngine;

public class SomeBehaviour : MonoBehaviour
{
    AndroidPerformanceTuner<FidelityParams, Annotation> tuner =
            new AndroidPerformanceTuner<FidelityParams, Annotation>();

    void Start()
    {
        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);
        };
    }
}

此代码足以启动 Android Performance Tuner 并检测您的游戏。日志语句指示 Android Performance Tuner 何时启动以及遥测数据何时已上传到 Google Play 管理中心 API。稍后,您将在日志中找到这些语句,以验证插件是否正常运行。

延迟初始化(仅限 Vulkan)

如果您的游戏以 Vulkan 为目标并使用 Android 帧速,则 Android Performance Tuner 应进行延迟初始化

IEnumerator Start()
{
    yield return new WaitForEndOfFrame();
    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);
    };
}

验证遥测数据上传间隔

插件设置中遥测数据上传的默认间隔为 30 秒。此时间设置为较短的间隔,以便更轻松地验证遥测数据的正确上传。当您将游戏发布到生产环境时,请将其设置为较长的间隔(例如,每 10 分钟),这样游戏就不会向 API 发出过多请求,这对于没有包含无限流量的移动数据套餐的用户来说尤其重要。较长的间隔还可以避免过度消耗设备电池。

要验证间隔是否设置为 30 秒,请执行以下操作

  1. 选择 Google > Android Performance Tuner 以访问设置。
  2. 选择检测设置标签页,然后点击使用高级设置
  3. 验证间隔(分钟)字段是否包含0.5

插件中的检测设置标签页

验证是否正常运行

如果您正在使用 IL2CPP 或代码剥离,请参阅管理代码剥离

构建您的 Android 游戏。当您的游戏在设备上启动时,在您的计算机上打开一个终端并启动 adb logcat

adb logcat

adb logcat 的输出中,搜索“TuningFork”(因为 Tuning Fork 是该库的内部名称)

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.116 10511 10536 I Unity   : Tuningfork started with code: Ok
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

如果您在设置插件时犯了错误,例如忘记设置 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 设置中将每次上传之间的间隔正确设置为较小的值,例如 30 秒。

管理代码剥离

Google.Protobuf.dll 使用反射。在代码剥离期间,可能会删除一些必需的代码。为避免此删除,插件包含一个 link.xml 文件,其中包含应保留的符号信息。如果您需要 protobuf 的某些使用反射的功能,并且已启用代码剥离,请将此信息添加到 link.xml 文件以保留符号。

您可以从 Unity 文档中详细了解 托管代码剥离

如果您需要保留 protobuf 中的所有符号,请向您的项目添加一个包含以下内容的 link.xml 文件

<linker>
  <assembly fullname="Google.Protobuf" preserve="all"/>
</linker>

提前编译 (AOT)

IL2CPP 后端以及 Unity 2017 和 2018 版本(但不包括更高版本)需要提前编译。

AOT 编译器可能不会为泛型方法生成代码。您需要通过添加以下方法来强制编译器生成 protobuf 所需的正确代码

using Google.Protobuf.Reflection;
using UnityEngine.Scripting;

...

// Don't call this method.
[Preserve]
void ExampleOfForceReflectionInitializationForProtobuf()
{
    FileDescriptor.ForceReflectionInitialization<Scene>();
    FileDescriptor.ForceReflectionInitialization<ShadowType>();
    FileDescriptor.ForceReflectionInitialization<LevelType>();
    ...
    // Add FileDescriptor.ForceReflectionInitialization<T> for each generated enum.
    // You can find the list of enums in DevTuningfork.cs -> enum section
    // or in the list of enums in Google -> Android Performance Tuner.
}

您可以从 Unity 文档中详细了解 脚本限制