【HarmonyOS Next】【性能优化】常用Trace使用指导

HarmonyOS Next应用开发案例(持续更新中……)
HarmonyOS Next性能指导总览

本篇文章链接,请访问:https://gitee.com/harmonyos-cases/cases/blob/master/docs/performance/common-trace-using-instructions.md

概述

OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力,每一处打点即是一个Trace,其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析,在其绘制的泳道图中,对应用运行过程中的性能热点进行分析,得出优化方案。本文旨在介绍OpenHarmony中常用的Trace,解释它们的含义和用途,并阐述如何通过这些Trace来识别潜在的性能问题。同时,我们还将详细介绍Trace的工作原理,帮助读者更好地理解这些Trace及如何实现性能数据的采集和分析。通过本文的阅读,读者将对OpenHarmony中的Trace有一个深入的了解,为应用程序性能优化提供有力支持。

常用Trace及含义

下面将从渲染流程入手,配合常用场景介绍常用Trace。

渲染流程

与其他操作系统相同,OpenHarmony也是由Vsync信号控制每一帧绘制操作的时机。Vsync信号是一个垂直同步信号,它指示显示器在垂直空白期之后开始下一帧的刷新。设备的屏幕以固定的频率发送Vsync信号,以刷新率60Hz举例,则屏幕每隔16.6ms发送一次Vsync信号。在收到Vsync信号后,UI后端引擎开始准备屏幕的下一帧绘制,然后应用程序提交渲染命令,用于描述图形绘制、纹理设置、着色器使用等。一旦应用程序提交了渲染命令,UI后端引擎会将其添加到渲染队列中,并在合适的时机执行这些渲染命令,通常会在后台线程执行,以确保主线程不被长时间阻塞。当这些渲染命令被UI后端引擎执行时,它们会被传递给图形系统Render Service进行处理,图形系统会根据命令进行相应的图形计算和渲染操作,如顶点变换、光照、纹理贴图等。在图形系统完成渲染后,渲染结果将被写入帧缓冲区。帧缓冲区是一个内存区域,存储用于显示器输出的图像数据。一旦帧缓冲区更新完成,UI后端引擎会等待直到下一个Vsync信号到来,这个过程是为了确保渲染结果在显示器垂直消隐之前准备好。当下一个Vsync信号到来时,UI后端引擎将已经准备好的帧缓冲区的内容发送给显示器,显示器根据这些数据刷新自己的像素,至此完成一整个渲染周期。如图1所示。

图1 渲染流程图

从Trace角度来看,一帧的渲染流程如下:

(1)Vsync信号到达;

(2)UI后端引擎进行第一帧绘制;

(3)向Render Service通信,传输绘制命令并请求一帧;

(4)Render Service对多个图层进行合并,计算刷新区域,然后进行渲染和绘制本帧;

(5)完成一帧绘制后交给屏幕。

一帧的渲染流程中的UI后端引擎的常用Trace的含义如图2所示。

图2 UI后端引擎渲染Trace泳道图

序号 Trace 参数说明 描述
1 OnVsyncEvent now:%" PRIu64 " 当前时间戳–纳秒级 收到Vsync信号,渲染流程开始
2 FlushVsync 刷新视图同步事件,包括记录帧信息、刷新任务、绘制渲染上下文、处理用户输入
3 UITaskScheduler::FlushTask 刷新UI界面,包括布局、渲染和动画等
4 FlushMessages 发送消息通知图形侧进行渲染
5 FlushLayoutTask 执行布局任务
6 FlushRenderTask %zu 当前页面上的需要渲染的节点的数量 总渲染任务执行
7 Layout 节点布局
8 FrameNode::RenderTask 单个渲染任务执行
9 ListLayoutAlgorithm::MeasureListItem:%d 当前列表项索引 计算列表项的布局尺寸

图形图像子系统中的Render Service,是负责界面内容绘制的部件,处理由各个应用提交的统一渲染任务,将不同应用渲染的图层进行合并、送显。在收到每个Vsync周期信号时,首先处理应用提交的指令,包括应用渲染树节点的新增、删除、修改,然后进行动画计算和遮挡计算,以上是为了对统一渲染树进行更新。接下来开始对渲染树执行绘制,首先预处理每个节点,计算绝对位置和脏区信息,然后针对脏区进行绘制,优先使用硬件合成器进行绘制,当遇到无法合成绘制的,交由GPU执行重绘,绘制的所有结果都将存入屏幕缓冲区,最后将绘制结果提交送显、上屏展示。

当Vsync信号刷新时,如图3所示。

图3 RS侧渲染Trace泳道图

序号 Trace 描述
1 RSMainThread::DoComposition 合成渲染树上各节点图层
2 RSMainThread::ProcessCommand 处理client端指令
3 Animate 动画处理
4 RSMainThread::CalcOcclusion 遮挡计算
5 ProcessDisplayRenderNode[x] 单个显示器画面的绘制流程
6 ProcessSurfaceNode:x 单个节点的合成器处理
7 Repaint 硬件合成器合成绘制
8 Redraw 无法进行合成,则执行重绘
9 RenderFrame GPU执行绘制
10 SwapBuffers 刷新屏幕缓冲区
11 Commit 绘制结果提交上屏

懒加载

懒加载使用LazyForEach实现,LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用时,框架会根据滚动容器可视区域按需创建组件。当组件滑出可视区域外时,框架会进行组件销毁以降低内存占用。图4抓取的是懒加载过程中一帧的Trace。

图4 懒加载Trace泳道图

序号 Trace 参数说明 描述
1 OnIdle, targettime:%" PRId64 " 时间戳,在这个时间之前完成该任务 idle事件循环中检查是否有新的事件需要处理,如果有,则将任务调度器加入UI线程中并执行预测任务
2 expiringItem_ count:[%zu] 懒加载Item的个数 预构建,包含处理所有懒加载项
3 List predict 添加预测布局任务
4 Builder:BuildLazyItem [%d] 需创建的项目索引 在需要时创建项,并进行缓存
5 Layout[%s][self:%d][parent:%d] tag标签,当前节点在UINode树中的索引,父节点在UINode树中的索引 当前帧节点布局
6 Build[%s][self:%d][parent:%d] tag标签,当前节点在UINode树中的索引,父节点在UINode树中的索引 当前帧节点构建
7 CustomNode:BuildRecycle %s JS视图名称 触发复用渲染
8 ExecuteJS 执行JS代码

页面加载

当触发页面加载时,OpenHarmony会创建一个新的页面实例,然后按照特定的程序调用页面的生命周期方法。在生命周期方法中加载页面的布局,然后将数据绑定到页面上的视图元素,使页面能够显示和更新数据。图5抓取的是页面加载中一帧的Trace。

图5 页面加载帧Trace泳道图

序号 Trace 参数说明 描述
1 PageRouterManager::RunPage 页面路由预处理及加载页面
2 PageRouterManager::LoadPage 加载页面并路由
3 JsiDeclarativeEngine::LoadPageSource 加载一个JavaScript文件并将其解析为ABC字节码
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值