最近收到反馈——IM模块语音按钮点击不灵敏,反应慢,有时点了没反应。
初看“有时点了没反应”以为是语音按钮太小没点到,毕竟iPhoneX导航栏返回按钮也曾被反馈过难按,原因是 一样大小的返回按钮在刘海屏上变得难触。
照这思路调了一下按钮大小然后进行测试
大得可怕的按钮.png
(这怎么可能没点到)特意和WX的语音按钮对比了一下大小。
在真机上测试一遍。
真机测试.gif
如图,在跳转到聊天控制器后,已经第一时间仅一次按住按钮(未松手),但是还是过了一段时间才加载出来。
得出结论:用户点击语音按钮后,未等到加载出来就松手,造成点击不到的假象。实际上是加载慢。
这就涉及到优化问题了。之前听过杜优秀介绍过一款传说中的时间分析神器,一直没用过。是时候请上今天的主角——Time Profiler。
打开步骤1.png打开步骤2.png
主界面.png
主界面配置.png
PS:还有个项目配置,不配置看上去有一些地方显示一坨十六进制码,原理和bugly一样。更多请查看https://www.jianshu.com/p/0fd670547235
测试过不配置好像没太大问题。
配置好后按以下流程走
0⃣️先将程序运行在设备上。
1⃣️在图中1处选好设备和程序。
2⃣️在图中2处勾选上Hide System Libraries,顾名思义隐藏系统函数,减少干扰。
3⃣️点击图中3处录制按钮,此时设备将会重新开始运行程序(不进行编译过程)。
4⃣️在设备上操作App。
5⃣️点击图中3处录制按钮停止监测。
开始测试!
测试时间表.png
其实在文头动图中除了语音呼出慢,还注意到点击联系人后跳转到聊天控制器(ChatViewController)也很慢(简书上的gif加快播放速率了,实际很慢),看看能不能顺手解决。
在图中可以看出该控制器viewDidLoad居然用了2.14s,难怪跳转这么慢。
展开后.png
展开后发现罪魁祸首setupFaceView占用了2.05s。
这个方法作用——配置表情的view,其中有许多页表情😊。想来里面肯定用了重用机制,也是在异步线程中执行,除此我想不到别的优化方法。看来只能骗一骗用户。
理性分析一波,因为用户进入该界面通常并不会马上点击表情列表,而且该view运用懒加载,所以把该方法放到viewDidAppear里,不会重复创建对象,同时加快主界面的显示,这是惯用的小伎俩了。
修改后再次测试发现跳转速度贼快(图见文尾)。
再回到语音呼出慢这个问题。
这个有点棘手,在模拟器上运行呼出很快,但是真机上却龟速。
一开始误以为原因是模拟器的跟真机的配置不完全相同(虽然配置不同这件事是真的),但结果并不是因为配置原因。
观察右边Main Thread,发现呼出两次,主线程时间并未增加多少。再观察下方时间有变动的方法有两个。
1⃣️-[UIButton(SDAutoLayoutButton) sd_button_layoutSubviews]
2⃣️-[UUProgressHUD startAnimation]
两个方法分别是button和label适应,总体也没占多少时间,即关键不在这上面。但为什么这么慢呢?
仔细观察发现,手指按住按钮后过了一段时间,时间分析器才开始增加时间。
最终发现原因是按钮延时响应。
参考文章https://www.jianshu.com/p/ac821fb9b3d0
参考文章https://www.jianshu.com/p/93b08b97968b
照第一篇文章的方法解决了该问题。
最终修改成效,与文章开头的动图一样的操作。
以上感叹一句,Time Profiler真是一款好工具。
网友评论