本文使用Skia Debugger来分析图层合成的方法,可以评估App或者系统的图层参数设置是否正确,是否存在多余的图层。特别是在座舱、屏幕比较多、自定义UI和图层比较多的场景下,用途是非常大的。(它也是可以用于分析App绘制的Skia过程哦。)
1. 背景
在座舱系统中,往往存在多个屏幕,而且自定义图层也是非常多,往往需要显示导航、音乐、视频、导航栏等,而且座舱系统的桌面效果效果普遍比较炫酷,往往还附带动态壁纸,追求立体感会附带大量的模糊。大量的图层给系统合成任务造成了很大负担,调试和优化合成任务是非常有必要的。
2. Skia Debugger
可以通过https://debugger.skia.org来访问工具,上传mskp文件,即可分析合成过程。如果是单帧,则是.skp文件。
主要内容有:
- 回放
- 合成的详细过程及其命令展示
- 图层的参数
3. 抓取mskp文件
adb root
adb remount
frameworks/native/libs/renderengine/skia/debug/record.sh rootandsetup
frameworks/native/libs/renderengine/skia/debug/record.sh 2000 # 录制2000毫秒
adb pull /data/user/re_skiacapture_*.mskp
在Skia Debugger Tool打开re_skiacapture_*.mskp文件即可。
4. 分析方法
点击页面左侧的command列表,可以在右侧看到当前command的结果,同时,可以查看Skia接收到的Layer,以及layer的具体参数。
打开command某一项,可以查看到Skia SKSL。
结合屏幕实际的截图,再分析此合成过程是否有一些多余的动作或者图层。
本人就发现过这样的一个Bug:被覆盖的底层图层意外参与了合成。
- 有两个叠加的图层,两个图层都开启了模糊,性能消耗比较大;
- 上层覆盖了底层,底层并没有显示出来,用户是无感的,但却参与了合成;
- 分析两个图层的参数发现,底层的圆角要比上层的圆角小;
结果:SurfaceFlinger在合成前,分析Layer发现,底层Layer有可见的区域,于是判定为需要合成。
由于底层也开启了模糊,面积也不小,增加了5%~10%的合成负载。