初始化库并验证操作

此页面介绍如何在游戏代码中初始化库并验证它是否将数据上传到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性能调节器并为您的游戏添加检测功能。日志语句指示Android性能调节器何时启动以及何时将遥测数据上传到Google Play控制台API。稍后,您将在日志中找到这些语句以验证插件是否正常运行。

延迟初始化(仅限Vulkan)

如果您的游戏以Vulkan为目标并使用Android帧速率配速,则Android性能调节器应进行延迟初始化

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性能调节器**以访问设置。
  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性能调节器是否正在上传遥测数据。如果在日志中看到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性能调节器设置中将每次上传之间的间隔正确设置为较小的值,例如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版本需要提前编译(但Unity的更高版本不需要)。

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文档中阅读有关脚本限制的更多信息。