业界流畅度监控方案调研(Android)
——
丨 1. 基础流畅度概念介绍
1.1 理想帧率:
60FPS,受限于显示器的刷新频率 60HZ
1.2 理想帧长:
1/60≈16.6ms
1.3 Vsync 机制:
VSync 可以简单的认为是一种定时中断,系统在每次需要绘制的时候都会发送 VSync Pulse 信号,cpu/gpu 收到信号后马上处理绘制。
丨 2. 业界方案调研
丨 3. 监控实现原理
3.1 统计帧长基于 VSYNC:统计帧长、SM、SF:
Choreographer 类就是接受系统垂直同步信号(VSync 信号),在每次接受 VSync 信号时顺序执行 View 的 Input、Animation、Draw 等 3 个操作,然后等待下一个信号,再次顺序执行 3 个操作。如果第二个信号到来时,Draw 操作没有按时完成,界面将不会更新,显示的还是第一帧的内容。这就表示丢帧了,丢帧是造成画面卡顿的原因。所以我们可以向 Choreographer 类中加入自己的 Callback,通过此 Callback 的 doFrame 函数我们可以统计一秒内帧绘制的次数(即流畅值 SM )、绘制耗时(两次 doFrame 之间耗时,即帧长)、丢帧 SF。
3.2 基于 Looper:
利用 UI 线程的 Looper 打印的日志匹配获取帧长。和 VSYNC 方案类似,只是当 UI 线程阻塞严重时,可能出现数据丢失。(对 UI 线程的影响也是一个待平衡点)
3.3 堆栈监控:
单开线程定期抓取堆栈,基于 Vsync 或者 Looper 机制监控到帧长超过指定阈值时,上传最近的堆栈。但由于单开线程实时抓堆栈,会导致应用本身性能退化,不适宜线上长期大面积使用。
3.4 监控注意事项(实测经验):
实际测试中发现,APP 静置时,尤其是网页静置时,SM 值亦可能出现变低如接近 30 的情况,SF 值、帧长均可能存在超过理想值的情况。原因是用户虽未对界面进行操作,亦可能在后台发生下载、屏幕显示区域之外的动画等行为,整体界面展现上表现不出卡顿,但可能会对用户肉眼感知不到的加载等造成影响。
——不同阶段、不同场景下,相同流畅度指标的绝对值,对用户实际体验的反应准确度有所不同,因此建议区分场景和阶段进行监控。
参考资料
——
萧竹:Android App 性能评测分析-流畅度篇
htkeepmoving:移动 APP 性能评测-流畅度评测
腾讯:【腾讯 TMQ】GT3.1 简化您的 App 性能测试(2)——原理讲解,溯本求源
微信读书:卡顿监控系统
腾讯 perfdog:PerfDog 性能狗帮助文档
whbsspu:为什么帧率达到 60fps 页面就流畅?
egos:Android 中 VSync 机制的介绍
markzhai’s home:BlockCanary — 轻松找出 Android App 界面卡顿元凶(AndroidPerformanceMonitor)
本文转载自百度 App 技术公众号。
评论