鸿蒙 Flutter 性能调优之滑动响应时延
鸿蒙 Flutter 性能调优之滑动响应时延
本篇文章针对 flutter 应用的滑动场景,进行响应时延的 trace 分析。
手指按下
手指按下是所有点击或滑动事件的大前提,可以知道手指坐标的初始位置和触摸哪个控件等重要信息。
mmi_service 线程负责触发多模交互事件,由 Flutter 应用监听和响应触摸事件。
手指按下的触摸事件,会立即转发给 Flutter 应用。
在 mmi_service 线程的"package touchEvent"的 trace 后面的下一个 trace,可以看到"service report touchId:编号, type: down"的 trace,type 为 down,说明是手指按下的触摸事件。而在应用主线程,有"DispatchTouchEvent"的 trace,上面有详细坐标打印和触摸事件类型,type 数值为 0,说明是手指按下的触摸事件。这两个线程上的 trace 是对应的。
手指滑动
手指滑动的触摸事件,不会立即转发给 Flutter 应用,而是由 vsync-app 信号来控制发送。
和手指按下的 trace 一样,mmi_service 线程和应用主线程都有一样的 trace 可以对应,只是 type 类型不一样。type 为 move,数值为 2。
手指滑动的触摸事件需通过 flutterSyncName 的 vsync-app 信号触发,之后才能传递到 flutter 应用主线程。因此,时间顺序是,mmi_service 到 VSyncGennerator,再到 DVSync-app,最后到应用主线程。trace 顺序如下图:
注意:第一个手指滑动的触摸事件的坐标点和手指按下的触摸事件的坐标点是一样的。
滑动阈值 TouchSlop
TouchSlop 是系统所能识别的滑动的最小距离,是一个阈值,称为滑动阈值。用户可以自定义设置控件的滑动阈值,系统默认值是 18。
那么通过查看应用主线程的触摸事件 trace 的坐标,可以自行计算坐标偏移量是否达到滑动阈值。
4.滑动首帧当手指滑动的触摸事件的滑动距离超过设定的滑动阈值时,Flutter 应用会触发 update 操作。但是,实际的绘制操作需要等待下一帧的到来才能执行。所以滑动开始的第一帧渲染,会在触摸事件满足滑动条件后,还需等待一帧的延迟。
trace 如下图:
首帧渲染
渲染的大致过程看性能分析-帧渲染跟踪,需要准确找到对应的 trace。
帧渲染的结束是在 RS 进程的 RSHardwareThread 线程上,但是在自动化测试的时候,帧渲染的结束标识是 dpu_gfx_primary 线程。(dpu_gfx_primary 只是一个硬件信号,不详细讲解)
trace 如下图:
所以从 mmi_service 线程的手指按下的 trace 开始,到滑动首帧渲染结束,这花费的时间就是滑动响应时延。
评论