相关问题
HarmonyOS 手机系统升级后,数组sort排序不对了
249浏览 • 1回复 待解决
系统升级HarmonyOS系统后app签名问题
1084浏览 • 1回复 待解决
HarmonyOS 系统升级后,使用Camera手机发烫,内存溢出
65浏览 • 1回复 待解决
DevEco Studio和系统升级后,EntryAbility.ets文件创建悬浮窗失败
568浏览 • 1回复 待解决
HarmonyOS Preferences的同步方法会造成UI卡顿么?
580浏览 • 1回复 待解决
长列表数据对象创建耗时过长导致UI卡顿
715浏览 • 2回复 待解决
DevEco Studio和系统升级后,EntryAbility.ets文件创建悬浮窗失败?
91浏览 • 0回复 待解决
HarmonyOS 页面滑动卡顿
223浏览 • 1回复 待解决
从旧系统升级到NEXT系统后,oaid到授权状态是否会延续
694浏览 • 1回复 待解决
HarmonyOS 横竖屏翻转卡顿
28浏览 • 1回复 待解决
升级鸿蒙系统后,手机耗电量比以前快了
21993浏览 • 10回复 待解决
HarmonyOS List嵌套waterflow滑动卡顿
455浏览 • 1回复 待解决
HarmonyOS 页面嵌套滑动时卡顿
18浏览 • 1回复 待解决
关于鸿蒙系统升级正式版都有啥机形
9665浏览 • 1回复 待解决
在ts中发现UI卡顿严重,需要使用异步多线程任务
2053浏览 • 1回复 待解决
HarmonyOS Next系统发布后,有没有准确的存量手机升级计划?
172浏览 • 1回复 待解决
HarmonyOS WebView加载H5卡顿
258浏览 • 1回复 待解决
HarmonyOS LazyForEach多层级数据性能卡顿
195浏览 • 1回复 待解决
HarmonyOS ReactNaive Rn的FlastList列表卡顿现象
225浏览 • 1回复 待解决
Web嵌套滑动卡顿怎么办?
362浏览 • 1回复 待解决
华为钱包的数据,待手机升级到HarmonyOS系统后,数据是否还会同步到手机
470浏览 • 1回复 待解决
HarmonyOS 地图计算复杂路线耗时导致页面卡顿
9浏览 • 1回复 待解决
关于启动慢问题首帧卡顿分析
585浏览 • 1回复 待解决
鸿蒙开发中 ListView 滚动卡顿,如何优化?
352浏览 • 0回复 待解决
不是华为手机可以升级鸿蒙系统吗
11132浏览 • 3回复 待解决
1.1 问题描述
1.2 初步分析结论
<a name="table159221726141716"></a> <table><tbody><tr id="row10941152661719"><td class="cellrowborder" rowspan="2" valign="top"><p id="p17941112631715"><a name="p17941112631715"></a><a name="p17941112631715"></a>手机版本</p> </td> <td class="cellrowborder" colspan="3" valign="top"><p id="p194192631715"><a name="p194192631715"></a><a name="p194192631715"></a>nativeTrack耗时</p> </td> </tr> <tr id="row20941122616170"><td class="cellrowborder" valign="top"><p id="p159415260176"><a name="p159415260176"></a><a name="p159415260176"></a>总耗时</p> </td> <td class="cellrowborder" valign="top"><p id="p5941182641715"><a name="p5941182641715"></a><a name="p5941182641715"></a>自身函数耗时</p> </td> <td class="cellrowborder" valign="top"><p id="p19941192615171"><a name="p19941192615171"></a><a name="p19941192615171"></a>libpaddle_light_api_shared.so</p> </td> </tr> <tr id="row11941202619175"><td class="cellrowborder" valign="top" width="25%"><p id="p79411826161710"><a name="p79411826161710"></a><a name="p79411826161710"></a>3.0.018</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p109421263171"><a name="p109421263171"></a><a name="p109421263171"></a>33ms</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p5942192681720"><a name="p5942192681720"></a><a name="p5942192681720"></a>22ms</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p794222651711"><a name="p794222651711"></a><a name="p794222651711"></a>总耗时10ms 调用8次 最大耗时3.5ms</p> </td> </tr> <tr id="row494212265179"><td class="cellrowborder" valign="top" width="25%"><p id="p1094211266179"><a name="p1094211266179"></a><a name="p1094211266179"></a>3.0.0.31</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p16942112616173"><a name="p16942112616173"></a><a name="p16942112616173"></a>67ms</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p109421826151718"><a name="p109421826151718"></a><a name="p109421826151718"></a>50ms</p> </td> <td class="cellrowborder" valign="top" width="25%"><p id="p17942226161710"><a name="p17942226161710"></a><a name="p17942226161710"></a>总耗时17ms 调用13次 最大耗时4.5ms</p> </td> </tr> </tbody> </table>
2.1 排查问题
step1 分析trace,对比差异
对比分析trace,调用栈发现耗时差异在so,需要看so的具体实现,找出可疑的部分。
step2 联合定位
日志打点,缩小范围,定位一个纯c++的函数在两个版本差异明显,锁定代码行数30+。
step3 内部写demo复现
按照业务流程,写demo,加上可疑代码,本地稳定复现,采用最笨的方法,给每行代码前后加日志打点,确认是yuv420sp[yp]这句代码在25版本耗时长;规避方案将yuv420sp复制一份,然后用复制后的char*参与计算;长期方案提单跟踪。
step1 分析trace,对比差异
都是连续的耗时任务,继续对比分析调用栈,发现nativeTrack函数在不同的版本耗时有差异,31版本耗时更大,可能就是这个函数耗时大导致ui线程阻塞,这个函数内部有多个其它函数会调用libpaddle_light_api_shared.so,汇总信息nativeTrack函数耗时主要有两部分内部自身耗时+libpaddle_light_api_shared.so耗时,其中libpaddle_light_api_shared.so耗时差异不大,耗时大头在内部自身代码。
看代码是纯c/c++编写,没有使用到系统接口,看不出来是哪行代码导致性能裂化,想着在可疑的地方加上日志打点逐句排查,这条路试过没走通;
step2 联合定位
重点看nativeTrack函数,影响代码行数1000+,逐行加打点这条路走不通,没办法找出劣化的具体点。
step3 内部写demo复现
代码1000+行,没办法写demo验证。
2.2 问题根因
问题一:手机系统18升级到25后ArrayBuffer取值性能变差,经开发确认是没有使能cache,surfaceBuffer数据是由相机创建填入的,buffer创建时需要填入usage信息,这个会影响buffer获取效率。
问题二:未找到根因,可以明确的是系统版本升级确实导致一段c++代码性能劣化,1s内onImageArrival会回调28次,平均30ms左右会触发一次,如果每次回调函数处理耗时50ms以上就会出现倒计时卡顿,代码太多没有办法找到劣化点。
2.3 解决方案
提供规避方案适配,计算完一帧数据才去处理下一帧。