目录

双指缩放时抖动卡顿

问题现象

在双指缩放应用内页面或图片时,缩放的动效卡顿不流畅。

背景知识

问题定位

  1. 使用DevEco Profiler中的Frame模板抓取双指缩放过程中的Trace,在UserEvents泳道可以看到手指操作事件的开始和结束时间,以此框定分析问题的范围。
  2. 在render_service线程中根据H:PreferredFrameRate获取当前屏幕刷新率为90Hz,根据背景知识中【屏幕刷新率】换算得平均单次刷新耗时11.11ms。
  3. 查看Frame泳道应用包名线程是否有标红的掉帧点。
    • 有标红掉帧点,查看对应时间范围应用包名泳道的应用包名子线程Trace,可以看到单次ReceiveVsync(接收Vsync信号)耗时70ms左右,远超步骤1中换算得出的11.11ms,说明此时在多次屏幕刷新时页面信息没有更新,在视觉上体现为卡顿丢帧。

      根据H:ViewPU.viewPropertyHasChanged xxx isValidate 0耗时53.8ms可以判断具体原因为状态变量更新时执行耗时操作导致此次ReceiveVsync(接收Vsync信号)耗时过长。

    • 没有标红掉帧点,需要对相关组件绘制渲染的频率进行分析。通过ArkUI Inspector抓取对应页面布局,得知使用的是Canvas组件。

      在Frame模板分析结果的上方搜索框中根据关键字H:FrameNode[Canvas][id:组件ID]::RenderTask搜索Canvas组件渲染的频率,可以看到每次渲染间隔在25ms左右,通过计算可得出应用侧渲染该组件的频率为40Hz左右,不到当前屏幕刷新率90Hz的一半,因此在双指缩放过程中有明显抖动卡顿现象。

分析结论

修改建议