此页面介绍如何在游戏代码中初始化库并验证它是否将数据上传到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秒,请执行以下操作
- 选择**Google > Android性能调节器**以访问设置。
- 选择**检测设置**选项卡,然后点击**使用高级设置**。
- 验证**间隔(分钟)**字段是否包含**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文档中阅读有关脚本限制的更多信息。