目录

ArkUI页面滑动卡顿丢帧问题分析

问题现象

页面滑动过程卡顿,不流畅。

背景知识

问题定位

ArkUI页面滑动卡顿丢帧问题的定位思路如下:

使用DevEco Profiler Frame工具录制滑动卡顿丢帧过程,相关步骤可以参考创建深度分析任务并进行录制。如果已有待分析的Trace文件,可以参考会话区中数据导入的步骤,将文件导入DevEco Profiler中查看分析。

  1. 识别滑动过程:在DevEco Profiler上方的搜索框中输入H:APP_LIST_FLING搜索。

    如下图为搜索Trace关键字H:APP_LIST_FLING的示例,其中H:APP_LIST_FLING为示例应用(包名为com.example.myapplication,Trace中简写为e.myapplication)的滑动泳道,泳道中有颜色部分(图中为紫色)为页面滑动过程。点击H:APP_LIST_FLING泳道右侧星型按钮将泳道置顶,方便问题分析。

  2. 识别卡顿丢帧位置。

    找到Frame泳道后点击左侧箭头展开,查看子泳道是否存在数据。

    • Frame泳道中的子泳道存在数据:

      根据H:APP_LIST_FLING泳道中的Trace点框选滑动过程的数据,点击Display泳道确认滑动过程的屏幕刷新率,如下图中可看到屏幕刷新率为120Hz左右(Avg Hz为119),则Vsync信号周期为8.3ms,如果应用侧或Render Service侧未在8.3ms内执行完渲染流程,会引起丢帧。

      通过App Frame(如e.myapplication的下方)和RS Frame(render_service下方)标签的泳道中可分别确认应用、Render Service卡顿丢帧的位置,出现卡顿丢帧(未在8.3ms执行完渲染流程)的地方显示为红色,正常完成渲染(在8.3ms内执行完渲染流程)的帧显示为绿色。

      如下图可看到应用(e.myapplication)存在几处卡顿丢帧,点击红色部分,然后点击"Details"区域"Corresponding Slice"下方左侧的箭头跳转到应用主线程泳道,结合App Frame卡顿丢帧处(红色部分)以及应用主线程的Trace信息,可以分析应用卡顿丢帧的原因。

    • Frame泳道中的子泳道无数据(比如打开.sys文件时会出现)时,可以找到render_service泳道展开,通过其子泳道H:PreferredFrameRate确认屏幕刷新率,框选滑动过程Present Fence(图形上屏信号)泳道来确认滑动帧率,如下图可看到屏幕刷新率为120Hz,滑动过程FPS为88.9,远少于120,存在滑动卡顿丢帧的现象。

      在滑动范围中,Present Fence泳道上缺少Trace点H:Waiting for Present Fence的部分(下图方框中空白的部分),很可能是存在丢帧问题,需要结合应用侧、Render Service侧主线程的Trace信息确认。

  3. 确认卡顿丢帧模块。
    • Frame泳道中的子泳道存在数据:可根据滑动范围框选Frame泳道,查看应用和render_service泳道相应的FPS值以及颜色来确认卡顿丢帧模块。
      • 应用进程卡顿丢帧:

        如下图为应用侧卡顿丢帧的示例(屏幕刷新率为120Hz),可看到应用泳道(e.myapplication)存在卡顿帧(红色),而render_service泳道无卡顿帧(绿色)。应用泳道的FPS值为87.6,远少于120,应用侧存在卡顿丢帧,而render_service泳道的FPS值少于120是应用侧发生丢帧,提交绘制相关数据较晚导致。

      • Render Service进程卡顿丢帧:

        如下图为Render Service卡顿丢帧的示例(屏幕刷新率为120Hz),可看到应用泳道无卡顿帧(绿色),而render_service泳道存在卡顿帧(红色)。应用泳道的FPS值为122.0,而render_service泳道的FPS值为11.9,远少于120,Render Service进程存在卡顿丢帧。

    • Frame泳道中的子泳道无数据:可根据应用主线程和render_service线程的Trace信息的宽度、密集特征来大致判断发生卡顿丢帧的模块。
      • 应用进程卡顿丢帧:

        如下图为应用侧卡顿丢帧的示例,可看到应用泳道中卡顿丢帧区域(方框部分)的Trace信息较宽且相连到一块,而右侧未丢帧处的Trace点较短且均匀分布。

      • Render Service进程卡顿丢帧:

        如下图为Render Service卡顿丢帧的示例,可看到应用泳道中的Trace信息较短且均匀分布,而render_service泳道的Trace信息较宽且相连到一块。

  4. 分析卡顿丢帧原因。

分析结论

ArkUI页面滑动卡顿丢帧的原因有:

修改建议