鸿蒙开发5.0【同页面内的点击操作响应时延问题】分析思路案例

news2024/11/15 10:51:47

1. 场景导入

同页面内点击操作时延是指,应用内手指点击从离开屏幕开始,到页面发生变化的时间。常见场景包括点击后界面元素变化,弹出弹窗或者loading动画等场景。

2. 性能指标

2.1 性能衡量起始点介绍

1.点击操作响应时延的性能衡量的起点为用户点击应用元素离手帧时间,终点为应用界面发生变化的首帧。推荐值:100ms

2.可以通过Avidemux这个工具数帧判断起点和终点

起点:手指抬起的那一帧

终点:页面发生变化那一帧

页面变化示意图:

1

如上数帧选取变化的第一帧(第二张图片)作为终点。

3. 问题定位流程

3.1 抓取trace

参考附录:通过IDE工具抓取trace

3.2 确认起止点

响应时延计算公式 响应时延=硬件耗时+软件耗时(整个耗时,包含我们在trace上看的软件的耗时,机器本身的一个硬件耗时,一般硬件耗时大概在30ms左右,在trace上的起点到终点的时间加上30ms左右的硬件耗时和测试给出的实际耗时能对的上即可。)

起点 mmi_service 对应的up事件 ,多模收到手指抬起事件。(对应图标1代表的点)

终点 页面变化第一帧对应RS HardwareThread:CommitAndReleaseLayers 的终点。(对应图标5代表的点)

2

注意 对于响应时延一般都是收到抬手事件后的第一帧。但是还是需要和视频实际数帧的时间对应,因为有可能出现,应用送了一帧,但是实际上在屏幕上人因视觉上看不到变化。所以需要往后再数几帧,算上硬件30ms左右的耗时,能和录屏数帧对上的应用帧,即可确认为页面变化帧。

数帧步骤

安装并打开Avidemux 这个数帧工具,导入视频,通过左右键按照标准(章节2.2)逐帧找到起始点,圈出起止时间。

3

3.3 整体时间段分解

关键流程 1.多模收到事件上报 -> 2.应用收到触摸事件 -> 3. 应用收到Vsync信号,刷新UI并将数据提交到RS侧 -> 4.RS子线程RSHardwareThread 将绘制结果提交到硬件完成上屏 (应用的每一帧都在重复3.4这两个流程)

流程图 根据流程,将整体耗时分成三段,多模阶段耗时,应用阶段耗时,图形阶段耗时

4

5

分析流程响应时延一般根据3.2确认起点终点,并拆解响应时延的三个阶段,输入阶段,应用阶段,渲染阶段。具体分析流程如下

6

4. 常见根因归档

4.1 Lottie 动画导致响应时延长

4.1.1 问题描述

问题描述: 应用内点击查询按钮,响应时延120ms,耗时长。

4.1.2 问题Trace 特点

1.关键trace点确认

根据测试提供的trace,通过3.2的介绍找到当前trace上的关键点

对应trace 点:

**7
**

分析数据

1.测试数帧实际结果是120ms ,在以上trace可以看到,应用第一帧,上屏时间在61ms左右, 第二帧上屏时间 85.5ms ,加上30多毫秒的硬件耗时,和录屏120ms能对应上。所以当前trace上页面发生变化的帧是对应的应用第二帧。所以终点应该是应用第二帧对应的RSHardwareThread 对应的CommitAndReleaseLayers的结束点,如上图。

2.从上面trace图来看,流程1到2(输入阶段)耗时4.5ms符合预期,从流程4到流程5(渲染阶段)耗时14ms左右符合预期。应用的第一帧和第二帧分别耗时37ms和34ms,那么显然这两段耗时是占大头。需要主要关注着两段耗时。

8

2.分析耗时长部分段

应用第一帧 耗时长达37ms,其中UI刷新部分只耗时1ms 不到,主要还是在ExecuteJs 上面,耗时34.4ms,这部分的调用JS代码的耗时,需要结合调用栈查看。

9

通过调用栈分析,这一段js代码是在DialogLoading.ets中,主要是在执行startLottie这个方法,通过调用方法文件目录分析,startLottie是调用的三方库Lottie的loadAnimation 方法。并且可以看到使用的Lottie三方库的版本oh_modules/.ohpm/@ohos+lottie@2.0.9/oh_modules/@ohos/lottie/src/main/js/animation/AnimationManager.js

10

从以上信息可以看出来,Lottie动画的加载大量耗时。再细看一下trace上这段Js执行,有大量的binder(跨进程调用) ,查看具体的每一个binder的调用,发现是在创建pixelMap。

11

再查看应用第二帧的耗时,这一帧耗时37ms,发现主要耗时是在做动画,查看这一段动画的堆栈信息,发现堆栈和上一帧很类似,再结合对应的文件路径,可以看到这段代码也是在Lottie库中。

12

基于以上分析,这两帧比较长耗时是因为Lottie动画的加载和绘制导致的导致的。此时需要找三方库的同学确认是应用用法问题还是三方库本身问题。

使用最新版本的Lottie2.0.10-rc.3 可以解决此问题。

4.1.3 优化方案

将Lottie 升级到最新的版本,2.0.10-rc.3。换到新版本之后,Lottie的loadAnimation优化到101us ,动画的每一帧优化到4ms

13

14

4.1.5 问题总结

响应时延主要分为三个阶段,多模,应用,图形。分阶段的看如果是多模和图形就找对应领域的同学看。一般来说,响应时延的大头还是发生在应用侧,需要看应用主线程是否有耗时长的函数阻塞主线程,或者是否有应用超长帧出现。如果有长段的ExecuteJs 就去看具体的调用栈,如果是FlushLayoutTask阶段耗时就需要结合UI组件树去分析,布局是否合理,是否有优化空间。

4.2 弹窗动画导致响应时延较长

4.2.1 问题描述

应用内点击评论区,操作响应时延长

4.2.2 问题Trace 特点

1.关键trace点确认

起点终点确认这是一个短视频类的应用,应用是在不停的刷帧,而且在trace上看应用第一帧实际上10几毫秒就送出了。但是通过数帧工具,数出来的时间达到250多毫秒。这个场景实际上并不好确定终点,只能通过起点,加上实际数帧时间,减去硬件耗时去判断终点的位置。

15

trace 分析

初步分析以上trace,发现其实并没有异常帧,应用的每一帧也都没有超时。同4.1分段确认,多模和图形侧的耗时也是合理的,主要的耗时是在应用的业务上这种情况需要结合,trace和应用的实际场景分析。

关键trace

在应用的trace中发现了一些关键的trace,“OnCreateSubWindow”,“LoadPage”,初步判断应用是通过窗口来实现评论区的效果。通过命令行抓取当前窗口hdc shell hidumper -s WindowManagerService -a ‘-a’ ,发现伙伴确实是使用了子窗口。

16

于是分析窗口创建部分的耗时,发现其实从离手到窗口创建完成并加载成功应用只耗时92.2ms,相比实侧数据250多毫秒,明显对不上,说明这个时候页面还未发生变化

17

继续向下分析发现此后的每一帧都比较类似,每一帧都有H:onFrame Animator, iteration -1,对应应该是在做动画。但是这个阶段屏幕其实还没有发生变化。

18

分析结论

基于以上分析,伙伴是用窗口实现的弹窗,并给窗口增加动画从底部往上弹窗,在页面加载完之后,的一点时间应用有送显但是页面还没发生变化,可能是此时窗口还在屏幕之外观察不到变化。所以需要确认当前弹窗的具体实现。

附录1 :如何抓取trace

1. 通过IDE 进行抓取

打开IDE->连接设备->打开Profiler->打开应用->操作到指定页面,先点击Create Session 创建一个Frame 模板,点击如图播放按钮开始录制,操作界面,完成操作之后结束录制。

19

附录2 响应时延常见trace 点解读

常见trace点在泳道上对应的位置

20

常用trace 点含义

泳道名称trace名称trace点含义对应trace点
mmi_serviceH:service report touchId:193373, type: up [id: 0, x:728, y:1356]多模收到触摸事件(事件类型和坐标)点1
应用DispatchTouchEvent应用侧收到触摸事件点2
应用OnVsyncEvent收到Vsync信号,渲染流程开始
应用FlushVsync刷新视图同步事件,包括记录帧信息、刷新任务、绘制渲染上下文、处理用户输入
应用UITaskScheduler::FlushTask刷新UI界面,包括布局、渲染和动画等
应用FlushMessages发送消息通知图形侧进行渲染点3
应用FlushLayoutTask执行布局任务
应用FlushRenderTask总渲染任务执行
应用Layout节点布局
应用FrameNode::RenderTask单个渲染任务执行
RSRSMainThread::DoComposition合成渲染树上各节点图层
RSRSMainThread::ProcessCommandUni处理client端指令点4
RSAnimate动画处理
RSRSMainThread::CalcOcclusion遮挡计算
RSProcessDisplayRenderNode[x]单个显示器画面的绘制流程
RSProcessSurfaceNode:x单个节点的合成器处理
RSHardwareThread**CommitAndReleaseLayers ****GPU渲染完成提交RSHD进行合成 **点5
RSHardwareThreadRepaint硬件合成器合成绘制
RSHardwareThreadRedraw无法进行合成,则执行重绘
RSHardwareThreadRenderFrameGPU执行绘制
RSHardwareThreadSwapBuffers刷新屏幕缓冲区
RSHardwareThreadCommit绘制结果提交上屏

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

在这里插入图片描述

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…

金蝶云星辰V1与旺店通·企业版对接集成采购入库单查询(列表+详情)连通创建其他入库单(其他)

金蝶云星辰V1与旺店通企业版对接集成采购入库单查询(列表详情)连通创建其他入库单(其他) 接入系统:金蝶云星辰V1 金蝶云星辰基于金蝶云苍穹云原生PaaS平台构建,聚焦小型企业在线经营和数字化管理,提供财务云、税务云、…

操作系统中的进程:深入解析与理解

文章目录 一、什么是进程?🤔二、进程的特性 🌟三、进程的组成 🧩四、进程的状态与转换 🔄🔀五、进程的调度与管理 🔧🔀六、代码示例(C)创建进程进程等待&…

scanf中%c前加不加空格的区别

%c前加空格可以让scanf跳过空白字符&#xff08;如空格、制表符、换行符等&#xff09;&#xff0c;直接读取非空白字符。如果不加空格就会读取空白字符。 可以用两段测试客官有无慧根的程序来说明这个问题&#xff0c;测试代码如下&#xff1a; #include <stdio.h> in…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…

1- 关键字static

文章目录 1 前言2 static修饰局部变量2.1 局部变量无static修饰2.2 局部变量有static修饰 3 static修饰全局变量 1 前言 在C语言中&#xff0c;static是用来修饰变量和函数的&#xff1a; 修饰局部变量 - 称为静态局部变量修饰全局变量 - 称为静态全局变量修饰函数 - 称为静态…

django空巢老人志愿服务系统-计算机毕业设计源码58726

摘 要 随着社会老龄化问题日益突出&#xff0c;空巢老人群体的关注和关怀日益重要。本研究设计并实现了基于Python的空巢老人志愿服务系统&#xff0c;旨在利用技术手段提供更多关爱和支持给空巢老人群体。 该系统结合Python编程语言的灵活性和易用性&#xff0c;实现了慈善捐赠…

HCIE杭州考试分享

考试过程&#xff1a; 首先提醒大家关注一下天气&#xff0c;我去杭州没看天气&#xff0c;去了一直下雨&#xff0c;鞋子也湿了&#xff1b;27号早上七点多到的杭州&#xff0c;雨一直下&#xff0c;去了直奔网吧上机&#xff0c;最后的机时&#xff0c;早饭和晚饭都在网吧吃…

Linux多线程间通信机制(互斥锁、条件变量、信号量,读写锁)同步与异步(二)

原文链接&#xff1a;https://blog.csdn.net/weixin_55796564/article/details/119699146 一、概述 本章介绍了线程同步的几种不同的方法&#xff0c;包括互斥锁、条件变量、自旋锁以及读写锁&#xff0c;当然&#xff0c;除此之外&#xff0c;线程同步的方法其实还有很多&…

如何获取设备消息?

一、什么是消息&#xff1f; 消息是设备向萤石云平台传输的带有特定内容的信息&#xff0c;大部分消息由设备端主动产生&#xff0c;并且上报到平台。举个例子&#xff0c;设备开启画面变化检测&#xff0c;当设备画面产生变化&#xff0c;设备就会产生报警&#xff08;画面…

Adobe Premiere Pro 2023-23.6.7.1 解锁版下载与安装教程 (一款专业的视频编辑软件)

前言 Adobe Premiere Pro&#xff08;简称PR&#xff09;是一款知名的专业视频编辑软件&#xff0c;数字视频剪辑软件。主要用来编辑视频和音频&#xff0c;可以在RGB和YUV色彩空间中以高达32位色彩的视频分辨率对4K和更高质量的视频文件进行编辑&#xff0c;支持VST音频插件和…

windows 10/11禁用更新

一、操作 获取“禁用更新”文件。将“禁用更新”文件从百度网盘中下载到电脑桌面。 百度网盘:链接:https://pan.baidu.com/s/1eGEtJYgN3MR4qGoUpnP7xw?pwd=ccrc提取码:ccrc 双击运行“禁用更新”。 弹出如下对话框,点击“是”。 弹出如下对话框,点击“是”。 确…

中仕公考:大四还没毕业能考公吗?

应届大学生是否可以报考公务员? 对于尚未获得毕业证书的应届大学生&#xff0c;有资格报名参与公务员考试。具体到学历和学位的要求&#xff0c;截止日期定于2024年7月底。在报名过程中&#xff0c;考生必须填写《报名登记表》和《报名推荐表》&#xff0c;确保提供的信息真实…

【手眼标定】使用kalibr对imu和双目摄像头进行联合标定

使用kalibr对imu和双目摄像头进行联合标定 前言 方式一&#xff1a;ros2消息格式通过ros1_bridge转为ros1消息格式&#xff0c;在ros1环境下录制bag进行标定。一、IMU标定二、双目摄像头标定三、手眼标定&#xff08;imu和双目摄像头的联合标定&#xff09; 方式二&#xff1a;…

Python轻量级 NoSQL 数据库之tinydb使用详解

概要 在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB 是一个纯 Python 实现的轻量级 NoSQL 数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍 TinyDB 库,…

SPAW7000高精度功率分析记录仪,测试方案

测试目标 评估双电机四驱系统中前后电机的性能。 分析前后电机之间的实时联动情况。 测量并分析电机控制器的输入与输出功率。 计算功率转换效率和损耗。 验证电机系统的谐波特性。 测试设备 SPAW7000高精度功率分析记录仪&#xff1a;用于测量功率、电压、电流等参数&am…

这个tiktok短视频才发布了一天,就能卖货1.6w美金

这个tiktok短视频才发布了一天&#xff0c;就能卖货1.6w美金&#xff01; 今天的讨论课上&#xff0c; 我的学员们问我 TikTok上的一条带货短视频的结构是怎样的&#xff1f; 我们一起看了这个案例。 一、案例分析 这是TikTok上的一位达人“moreco1in" 他拥有862K粉丝…

LeetCode.3152.特殊数组II

题目描述&#xff1a; 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi..toi…

【Linux】多线程7——线程池

1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源&#xff0c;在需要时可以重复使用这些预先准备的资源。 在系统开发过程中&#xff0c;我们经常会用到池化技术。通俗的讲&#xff0c;池化技术就是&#xff1a;把一些资源预先分配好&#xff0c;组织到对象池中…