2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案

@TOC

一,项目背景

在手游时代,消除游戏成为休闲游戏领域中的一个重要类型。《恶魔消除》是一款可以在手机上三消类益智游戏。游戏除了横竖交换物体得到消除之外,还添加类似魔方的行,列滑动的交互方式,让用户一样的交互体验。

1.1 开发环境:

  • Unity2019.4.19
  • JetBrains Rifer 2019.1.3
  • Xcode 12.5.1

二,所遇到的挑战

2.1 难在于发现问题

随着用户的增加,得到越来越多的用户反馈,游戏打开慢。

有上线经验的程序,应该都知道上线游戏能得到用户反馈的比例是很小的。用户反馈的两个必要条件:

  1. 喜欢你的游戏(需要你的程序)
  2. 程序存在不能忍受的问题

所以一旦有几个用户反馈了同一个问题,我们一定要重视起来(别问我怎么知道的)。

2.2 更难于定位问题

对于用户反馈的启动慢?

程序员:启动慢? 首次启动慢? 冷启动慢? 还是热启动慢啊? 什么机型? 系统什么版本?

这么一大堆问题,肯定没有办法去问用户啊。即便是问了也没有结果。因为大部分用户是不会回复的(能给反馈已经很不易了),剩下的一部分估计要反问了:什么是冷启动?什么是热启动?...

2.3 获取到解决方案

友盟+ U-APM 应用性能监控平台:(之前用过友盟+ 的统计功能,就感觉非常好用。这次又是友盟帮助解决了大问题[手动点赞]。)

2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案

由上图可以看到U-APM为我们提供了”2.2”中程序原提出的所有问题的信息统计,感觉真的不要太强大有没有。

虽然有了这么多的统计信息,可是我手里没有那么多测试机啊,总不能先接入SDK发布一个版本,看来用户数据来校验问题是否修正吧。这种想法可真是太可怕了,光是启动慢还好,要是闪退这种直接导致程序崩溃的致命问题,这么干无疑会伤一批用户,不过好在U-APM还为我们提供了云真机功能,并且还推出了免费体验时长,真是贴心~


三,解决问题的步骤

3.1 接入U-AMP

接入流程如下:(每一步官方都有详细文档,这里不再赘述)

2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案

官网地址:https://www.umeng.com/

3.2 定位问题

通过接入U-AMP结合官方提供云真机,多机型多次测试后。问题确定为冷启动时间较长。

几经周折,查了很多启动慢相关文章,解决方案基本归结如下:

  1. Resources管理资源:

    Resources目录下面的所有资源会在ResourceManager中记录下来,而ResourceManager就是一个文件,通常是一个YAML格式的文本文件。而这个文件是会在冷启动时加载的。所以Resources目录下面的有越多的资源,那么这个ResourceManager就会越大,加载时间也会越长。

    建议:使用AssetBundle的方式管理,在现在官方也推出了可寻址系统Addressable AssetSystem

  2. Shader编译时长:

    如果只有游戏安装之后第一次启动时间过长,一个很大的可能是Shader编译,之后游戏启动因为有了Cache,所以会快很多。这种情况的话建议查看下Always Include的Shader内容和变体。

    建议:使用shadervariantcollection等方案替代。

  3. 纹理资源过大:

    在游戏中一般是最大的资源,选择合适的压缩格式进行压缩,既可以减少内存占用,又能够加快资源的加载速度。压缩格式的选择要从显示效果和压缩率上进行权衡。

    建议:一般在Android上使用ETC格式,在iOS上使用PVRTC格式,在某些情况下,可能还可以考虑使用Alpha通道分离技术进行压缩处理

3.3 解决问题

由于原工程打包慢,所以我新建了项目,模拟还原了3.2中:Resources管理资源和纹理资源过大问题:

【新建工程,在Resource文件夹中放了资源,在其他文件夹下放了比较大的纹理】

打包测试结果如下:
2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案

经过减少Resource文件夹资源,和对比较大的贴图压缩后。

打包测试结果:
2021 友盟+移动应用性能挑战赛 -- Unity开发游戏启动慢问题解决方案

经过对比可以看到启动时间确实是减少了,证明方案可行,可以应用到实际项目。


四,项目总结

相比于Android或者IOS原生App,Unity3D引擎开发的游戏在冷启动时间上确实比较长。但是过长的启动时间会导致用户不好的用户体验,甚至损失一批用户。若没有用户反馈,可能问题一直得不到解决,很可能成为收益少的一大因素。

所以,平时开发时注重资源管理,后续就不会有这种类似问题。另外测试数据量,以及低端机型用户体验都是有必要作为关键测试点的。

最后建议[友盟+ U-APM SDK]。不管是统计工程和还是性能分析以及崩溃反馈都可以帮助开发者及时快速定位解决问题,以免带来更大的损失。

上一篇:使用SourceTree管理Unity工程推送报错 “ RPC failed; curl 55 Send failure: Connection was aborted“


下一篇:面试官:谈谈类加载器吧,你有没有看过类加载器的源码?