在 Android 游戏开发工具大升级 中,我们介绍了 Android 游戏开发套件的丰富功能和多项 API 改进,并针对大屏幕设备的游戏开发提供了一些建议,同时介绍了处理、分发大型游戏素材的最佳实践。本文我们将提供几则在游戏性能优化方面的技巧,同时向您介绍 Android 在游戏方面引入的新特性。让我们一起打造卓越的 Android 游戏体验吧!
如果您更喜欢通过视频了解此内容,请在 此处 查看。
游戏性能调优
在上一篇 文章 中,我们了解了如何通过合理的 DPI 选择、纹理优化等方式让游戏在更多的硬件上运行。然而仅仅能运行还不够,或许您也非常希望能了解这些选择和配置是否为玩家提供了足够优秀的用户体验,以及接下来有哪些方法能帮助您不断优化应用,并逐渐将应用推广至更大的用户群中。
配置 APT 库
Android 性能调优工具 (Android Performance Tuner,APT) 是专门用于开发者了解游戏性能数据的工具。它可以在 Android Vitals 中帮助您洞察游戏性能表现,使您能够在整个 Android 设备生态中衡量和优化自己的游戏保真度、加载时间、帧率。并且所有的数据都是来自真实的设备和真实的玩家,具有极高的参考价值。
void InitAPI(JNIEnv* env, jobject activity) {
SwappyGL_init(env, activity);
swappy_enabled = SwappyGL_isEnabled();
TFSettings settings {};
if (swappy_enabled) {
settings.swappy_tracer_fn = &SwappyGL_injectTracer;
}
// ...
}
△ 使用 Swappy_injectTracer 自动记录帧信息
要使用 APT 库,您需要在每一帧中调用一个 tick 函数。不过如果您已经使用了 Android FramePacing 库,则通过 FramePacing API 初始化时传入 Swappy_injectTracer 函数就可以自动记录帧时间了。
如果您用到了 Unity 游戏引擎,则可以导入我们的自定义软件包 (插件),然后从 Window → Android Performance Tuner → Setup 菜单进入设置界面来启用和配置它。此外您还可以使用设置脚本来初始化 APT 工具。如果您希望了解关于 Unity 游戏引擎的更多信息和使用帮助,请参阅 Unity Codelab 将 Android 性能调优工具整合进您的 Unity 游戏:
△ Android 性能调优工具与 Unity 结合使用
下一步是定义注解参数,并将它们与游戏中的质量级别、场景或其他值得关注的信息关联起来。随后,您需要在适当的上下文调用 APT 的 API。
△ Unity 的 APT 插件中设置注解参数
如果您使用了 Unity 的 Android 性能调优工具插件,那么可以在配置面板的注解参数中看到几个默认的注解:
- 场景 (Scene) 注解映射到当前处于前台的游戏场景;
- 加载状态 (LoadingState);
当然,您也可以在上图的界面里添加更多自定义注解参数。如果您集成了 C/C++ 的引擎,那么需要您用 Protocol Buffers 来定义这些注解:
import "tuningfork.proto"
enum LoadingState {
INVALID_LS = 0; LOADING = 1; NOT_LOADING = 2;
}
enum Level {
INVALID_LEVEL = 0; Level_1 = 1; Level_2 = 2; Level_3 = 3;
}
message Annotation {
optional LoadingState loading_state = 1;
optional Level level = 2;
}
△ 定义注解参数
您还可以在 Codelab: 使用 Proto DataStore 中了解到更多关于使用 Protocol Buffers 的内容:
extern "C"
void SetAnnotations() {
Annotation a;
a.set_loading(
sLoading ? proto_tf::LOADING : proto_tf::NOT_LOADING
);
a.set_level((proto_tf::Level) sLevel)
auto ser = tf::TuningFork_CProtobufSerialization_Alloc(a);
TuningFork_setCurrentAnnotation(&ser);
TuningFork_CProtobufSerialization_free(&ser);
}
△ 设置注解参数的值
随后,您需要调用 APT 的 API 告知上下文发生了变化,参见上面的代码。
完成 APT 库的集成和注解参数配置后,您需要在 Google Cloud Console 中启用 Android Performance Parameters API,这样才能开始收集玩家数据。参照下图找到该 API 并启用:
△ 在 Google Cloud Console 中启用 APT
游戏加载时间调优
对于玩家来说,游戏的加载时间很大程度影响了他们在闲暇时间打开游戏的意愿。有了 APT,您可以清楚地看到在不同设备、不同启动类型下游戏加载时间的统计图表:
△ Android 性能调优工具显示的加载时间
如下图所示,startRecordingLoadingTime 方法可以使用给定的事件元数据和注释创建一个加载时间事件,并且将参数中的句柄 (handle) 设置为刚才创建的加载事件,便于后面使用 stopRecordingLoadingTime 方法结束时间记录过程。
△ Android 性能调优工具记录加载时间的两个函数
您一定要记得调用 stopRecordingLoadingTime 方法,它会结束此前启动的加载时间事件,暂存刚才记录的结果,并于下一次会话清理时将事件记录上传到 Google Cloud 进行统计分析。加载时间事件中包含了许多元数据,可以帮助我们正确地区分不同场景下的加载时间,比如应用首次冷启动、后台转前台运行、加载新关卡等。如果涉及到网络加载,还会显示加载的数据源和网络类型信息。参见图中的结构体定义:
△ Android 性能调优工具中加载时间事件包含的元数据
除了提供上面的几个注解,您还可以添加一些自定义的注解来帮助锁定引起性能问题的源头。创建资源加载组也是一种不错的方法,比如,当您的游戏从 CDN 下载资源时,会形成大量可以单独追踪的下载任务和解压任务,为它们创建资源加载组可以很方便地分析这些任务执行的性能表现。
这些组也可以添加注解,这样您就可以看到造成特定场景加载缓慢的原因了。此时需要使用另一组方法,图中给出的是启动记录的方法 startLoadingGroup 的函数签名:
△ startLoadingGroup 函数签名
当您完成这些集成和调用后,耐心等待一段时间,Google Play 控制台的 Android Vitals 中就将显示这些加载时间的统计信息,比如: 首次加载、冷加载、热加载、关卡加载时间等等。您可以很方便地了解到用户是否因为加载时间过长,而失去耐心退出游戏,还可以深入了解哪些设备或者关卡可能遇到了问题。
△ 在 Android Vitals 查看游戏加载时间统计信息
Android Vitals 也可以显示帧率的统计信息,呈现方式非常类似:
△ 在 Android Vitals 查看游戏帧率统计信息
您可以从中了解到哪些设备的性能不足以支撑游戏流畅运行,哪些场景造成的帧率下降问题最严重。有了这些信息,您就可以优先针对那些最需要调整优化的用户群进行改进,让您的游戏能在尽可能多的设备上畅玩。
覆盖面和设备
最近我们在 Google Play 控制台提供了 “覆盖面和设备 (Reach and devices)” 功能,它可以帮助您更好地了解游戏覆盖的设备、国家区域以及在游戏生命周期内的测试和优化。您可以看到游戏的分布情况、安装趋势、崩溃率等统计信息,便于深入了解玩家和他们遇到的问题。
△ 安装分布和趋势统计信息
您还可以从多个维度分析这些数据,比如 SoC (System-on-Chip)、图形 API (如 OpenGL 和 Vulkan) 等:
△ 从多种维度分析数据
您还可以用自己的游戏数据与同类游戏的公开数据进行比较,从而发现新的开发方向,在着手开发下一版本之前做好充分的准备。另外,针对国家/地区的过滤条件能帮助您精确制定发布和扩张的计划。最后,您还可以选择导出这些统计数据,点击如图所示的 “Export report” 即可:
△ 导出统计数据报告
Android GPU 检查器
刚才我们从统计报告中基本确定了需要针对优化的方面,那么该怎样做呢?Android GPU 检查器不仅能提供游戏运行期间系统活动、高频硬件计数器的事件跟踪记录,还可以用类似 systrace 的工具在时间轴上绘制出时间占用图像。
Android GPU 检查器在两年前新增了对 GPU 显存信息的支持、使用 ANGLE 提供了 OpenGL ES 支持。在兼容了更多设备的同时,也增加了帧检查器 (Frame Profiler),它可以帮助您深入检查单个渲染帧,查看分解后的渲染通道级别的时间信息。另外,帧检查器还能帮您检查分析包括纹理、几何体、着色器、渲染管线在内的多种 GPU 信息,从而分析某一帧内进行的各种 GPU 活动。
△ Android GPU 检查器的新功能
我们也正在与更多的设备制造商合作,希望能尽快为您提供更多的现有设备支持。
跨设备畅玩
截至目前,我们已经实现了在更多的屏幕类型上运行您的游戏,试想这样一个场景: 您的玩家在下班路上掏出手机玩了一会儿游戏,到家后一阵忙碌,终于躺在沙发上,想要打开平板接着玩。那么如何保证玩家可以在平板上继续刚才手机上的游戏进度呢?
Google Play 游戏 SDK 为您提供了便捷的方法实现刚才的场景。它可以让玩家登录,并保存和同步游戏进度。这样一来,当同一账号在另一台设备登录时,您的游戏就可以检索并且取回服务器上的玩家数据,让他们可以直接从最后保存的时间点继续进行。同时,您还可以集成一些热门功能,比如游戏的成就系统、玩家排行榜等。
我们正在持续完善 Google Play 游戏服务,它提供了一个更加简化的登录 API,您可以在先行体验版的 SDK 中用一行代码实现登录功能,如下所示:
GamesSignInClient signInCli = PlayGames.getGamesSignInClient(this);
signInCli.isAuthenticated().addOnCompleteListener(task -> {
boolean isAuthenticated =
task.isSuccessful() && task.getResult().isAuthenticated();
if (isAuthenticated) {
// 继续使用 Google Play 游戏服务
}
});
△ 更新后的登录 API (预览版)
我们还计划简化用户账户的创建过程,当他们安装 Google Play 游戏应用时就会顺便创建个人资料了。这样一来,即使用户还没有安装好 Google Play 游戏应用,也能很快完成账户创建,然后回到游戏畅玩了。
△ 简化后的用户账户设置过程
另外,我们正着力于进一步简化自动登录流程,注册过的用户重新登录会变得更加简单。从 2022 年开始,用户就不再需要先安装 Google Play 游戏应用才能使用 Play 游戏服务了。
△ 2022 年 Google Play 游戏的新变化
有了这些更新,全球的 20 亿 Google Play 游戏用户就可以零点击登录 Play 游戏服务了。
游戏模式
随着越来越多玩家青睐移动游戏,我们也致力于让 Android 系统给游戏玩家和开发者提供更多的便利。从 Android 12 开始,部分设备将提供游戏模式 (Game Mode) API。这些 API 能让设备按照用户的需求提供极致的整机性能、平衡的性能或是最佳电池续航。而您前期为了适配各种设备对游戏所做的各项工作,刚好也可以用于响应这些性能相关的用户偏好。
另外,Pixel 6 之类的设备还集成了新的游戏中心面板,它能以悬浮窗的方式为用户提供游戏模式开关,以及帧率计数器和 YouTube 直播助手等游戏实用工具。
△ 边下载边玩功能
从 Android 12 开始提供的 “边下载边玩” 功能可以减少玩家的等待时间,让他们更快开始游戏。为了支持这项功能,您需要使用 App Bundle 来提交游戏,并且需要避免使用一些旧版本的 Ads SDK。这是因为旧版本的 Ads SDK 会在使用资源之前对其进行分析,这类行为会妨碍边下载边玩功能的实现。
总结
我们一起走过的漫漫长路因为有您的参与而生机勃勃。我们非常感谢您对 Android 游戏开发事业的支持,同时希望能给您提供更好的支持。在这篇文章中,我们向您分享了 Android 游戏性能调优的一些技巧,以及 Google Play 游戏服务的多项服务开发者和玩家的改进、基于性能调优工具的 Android Vitals 分析面板。我们也希望这些新特性和改进,能让玩家享受到更优秀的游戏体验,也能助力您更高效更轻松地开发游戏作品!
感谢您的阅读,欢迎了解更多 Android 游戏开发相关资源:
欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的 支持!