1{ 2 "render_services": [], 3 "anothers": [ 4 { 5 "slice": "SendCommands", 6 "CN": "发送绘制指令给图形Render_Service。transactionFalg的坐标可以标识这条指令与Render_Service侧的接收帧对应起来", 7 "EN": "this is an english translate for CN", 8 "flag": "0" 9 }, 10 { 11 "slice": "FlushLayoutTask", 12 "CN": "组件的布局,这一块可以确认是什么组件在创建或者复用", 13 "EN": "this is an english translate for CN", 14 "flag": "0" 15 }, 16 { 17 "slice": "CreateTaskMeasure", 18 "CN": "组件的测量。这一块可以确认是什么组件在创建", 19 "EN": "this is an english translate for CN", 20 "flag": "0" 21 }, 22 { 23 "slice": "JSAnimation", 24 "CN": "如果FlushVsync下面出现这个trace点,说明触发了ArkUI的动效,例如使用了属性动画animation属性或者显示动画animateTo。可以排查一下代码看一下这种场景是否需要触发这个动画,有时候会因为组件的刷新而出现该动画的冗余绘制", 25 "EN": "this is an english translate for CN", 26 "flag": "0" 27 }, 28 { 29 "slice": "FlushDirtyUpdate", 30 "CN": "用来标识由于变量更新,出发了某一个组件的标脏,需要对它进行刷新。打开ArkUI的debug开关后可以看到具体是什么状态变量裱花导致组件节点脏标。后面的数量表示这个状态变量关联的组件数", 31 "EN": "this is an english translate for CN", 32 "flag": "0" 33 }, 34 { 35 "slice": "CreateTaskMeasure", 36 "CN": "组件的测量。这一块可以确认是什么组件在创建", 37 "EN": "this is an english translate for CN", 38 "flag": "0" 39 }, 40 { 41 "slice": "SendCommands", 42 "CN": "发送绘制指令给图形Render_Service。transactionFalg的坐标可以标识这条指令与Render_Service侧的接收帧对应起来", 43 "EN": "this is an english translate for CN", 44 "flag": "0" 45 }, 46 { 47 "slice": "BuildRecyle", 48 "CN": "如果出现这个trace说明,这个组件是走复用逻辑的。当前如果组件节点较多,也会导致组件复用的时候耗时比较长导致丢帧。", 49 "EN": "this is an english translate for CN", 50 "flag": "0" 51 }, 52 { 53 "slice": "aboutToRecycleInternal", 54 "CN": "标识组件进入复用池。例如我们首页使用cacheCount会将自检及其相关数据都缓存起来,但是一旦触发了DataReload之后缓存就会失效,这时候缓存的组件会进入复用池,等待后面华东的时候触发组件复用。", 55 "EN": "this is an english translate for CN", 56 "flag": "0" 57 }, 58 { 59 "slice": "Onldle->List predict:onldle", 60 "CN": "标志Vsync中的空闲,一般会用来做预加载之类的。LIst predict就是列表的预加载。使用CachedCount和lazyForEach都会触发。", 61 "EN": "this is an english translate for CN", 62 "flag": "0" 63 }, 64 { 65 "slice": "RunningCustomAnimation", 66 "CN": "自定义动画,RSModifierManager管理的在UI线程运行的动画,例如LoadingProgess、滚动组件的松手滚动、slider的进度条变化动画......后面的num表示动画的数量,如果大于0,则表示有动画在运行,如果遇到需要定位具体的动画,则需要底层增加trace点", 67 "EN": "this is an english translate for CN", 68 "flag": "0" 69 }, 70 { 71 "slice": "DispatchDisplaySync", 72 "CN": "使用了displaySync接口进行降帧率处理,TimeStamp和TargetTimestamp分别表示当前帧的事件戳和下一次绘制的时间戳(估算的,并不准确)。Preffered[30]表示设置的期望帧率是30FPS,VsyncRate[120]表示实际Vsync的帧率是120PFS,Rate[4]表示事件送显的帧之间的间隔,noSkip[0]表示false,1表示true,标识这一帧是否需要绘制,0表示这帧跳过绘制,可以看到没有对应的sendCommands;1表示实际绘制送显,有对应的sendCommands的trace点", 73 "EN": "this is an english translate for CN", 74 "flag": "0" 75 }, 76 { 77 "slice": "PartialGC::RunPhase", 78 "CN": "触发了内存的GC,有时候会刚好遇上Vsync导致Vsync整体耗时长。当前已经做过优化,对于超过10ms的帧,在10ms后不做GC。但是如果是在Vsync刚开始的时候还是有可能会触发", 79 "EN": "this is an english translate for CN", 80 "flag": "0" 81 }, 82 { 83 "slice": "HandleVisibleChangeEvent", 84 "CN": "对应ArkUI的接口OnVisibleChange。ArkUI对于每一帧的Vsync必然会走这个方法的逻辑,即使应用没有使用也会遍历一把,一般耗时在us级。如果耗时几ms,甚至占了Vsync的一半时间,就需要分析一下了,先排查一下该场景是否滥用了OnVisibiChange接口", 85 "EN": "this is an english translate for CN", 86 "flag": "0" 87 }, 88 { 89 "slice": "HandleOnAreaChangeEvent", 90 "CN": "对应ArkUI的接口OnareaChange。ArkUI对于每一帧的Vsync必然会走这个方法的逻辑,即使应用没有使用也会遍历一把,一般耗时在us级。如果耗时几ms,甚至占了Vsync的一半时间,就需要分析一下了,先排查一下该场景是否滥用了OnAreaChange接口", 91 "EN": "this is an english translate for CN", 92 "flag": "0" 93 }, 94 { 95 "slice": "ViewChangeCallback", 96 "CN": "窗口变化会触发ArkUI的一系列回调,例如横竖屏转换的时候,接收到窗口变化ArkUI会从应用页面Root节点开始进行刷新和重新布局。", 97 "EN": "this is an english translate for CN", 98 "flag": "0" 99 }, 100 { 101 "slice": "FlushFocus", 102 "CN": "焦点切换,属于通用事件。每一帧都会打点,如果没有具体处理在几us左右。如果耗时异常,例如页面专场的场景。", 103 "EN": "this is an english translate for CN", 104 "flag": "0" 105 }, 106 { 107 "slice": "RSModfierManager Draw num", 108 "CN": "组件属性变更的绘制,如果num不变,持续绘制可能和动画组件的属性变更有关;如果只是一次性绘制,可能就是有些组件属性变更了一次。具体是什么组件引起的,需要动画加trace点继续定位。", 109 "EN": "this is an english translate for CN", 110 "flag": "0" 111 }, 112 { 113 "slice": "DispatchTouchEvent", 114 "CN": "应用侧接收到点击事件,并标识了具体的X,Y详细坐标,type是个枚举为0:down、1:up、2:move。可作为应用侧点击类事件的起始点", 115 "EN": "this is an english translate for CN", 116 "flag": "0" 117 }, 118 { 119 "slice": "H:UnMarsh", 120 "CN": "RSTransactionData:data size UI侧将要发送的指令序列化后通过IPC与RS通信,RS收到消息后就会对其进行反序列化,解析出对应的命令和数据。如果datasize较小会直接在IPC上进行反序列化,可以通过runnable找到对应的发送序列化的指令的应用侧的帧。如果data size较大,则会创建一个子线程RSUnmarshalThre进行反序列化操作。之前有个问题就是RS的每一帧处理会等反序列化处理完成,会阻塞RS主线程,导致丢帧。后来图形做了处理,旋转场景不等应用的反序列化数据,延迟处理", 121 "EN": "this is an english translate for CN", 122 "flag": "0" 123 }, 124 { 125 "slice": "RSMainThread::ProcessCommandUni", 126 "CN": "这个trace点后面会有个坐标点,和应用侧sendCommands发送的指令Flag坐标是一致的,标识这一帧处理对应的应用侧帧的进程号和序列号", 127 "EN": "this is an english translate for CN", 128 "flag": "0" 129 }, 130 { 131 "slice": "Animate", 132 "CN": "RS侧的动效,这一块正常也在us级别,有一些动效可能稍微耗时一些例如粒子动效。如果耗时超过2ms可能需要分析一下了。这个trace点里的具体是什么动效引起,需要动效的人增加日志或者trace点进行定位。RequestNextVSync表示动效还有下一帧,还未结束", 133 "EN": "this is an english translate for CN", 134 "flag": "0" 135 }, 136 { 137 "slice": "H:RSUniRender:PrepareDisplay", 138 "CN": "预处理,计算各节点的绝对位置,更新各个窗口的脏区。然后再更新屏幕中各个窗口的信息,最后将各个窗口的脏区进行合并", 139 "EN": "this is an english translate for CN", 140 "flag": "0" 141 }, 142 { 143 "slice": "H:RSUniRender::Process", 144 "CN": "标识当前参与绘制的应用窗口,并且显示窗口的位置以及大小", 145 "EN": "this is an english translate for CN", 146 "flag": "0" 147 }, 148 { 149 "slice": "PureContainerNode/ProcessedNodes", 150 "CN": "容器节点/总结点数。下面的小竖条详细展示了当前应用有多少个节点参与了绘制", 151 "EN": "this is an english translate for CN", 152 "flag": "0" 153 }, 154 { 155 "slice": "H:RSFilterCacheManager::DrawFilter", 156 "CN": "当前页面有模糊绘制,模糊数量两个及以上对RS的绘制就会造成较大影响。可以评估一下当前页面模糊的必要性,如果当前页面的多个模糊是必要的,可以考虑是否使用模糊合并。如果场景没法合并可以求助下一图形接口", 157 "EN": "this is an english translate for CN", 158 "flag": "0" 159 }, 160 { 161 "slice": "H:RSUniRender:FlushFrame", 162 "CN": "生成渲染指令后交给GPU执行", 163 "EN": "this is an english translate for CN", 164 "flag": "0" 165 }, 166 { 167 "slice": "H:RSHardwareThread::CommitAndReleaseLayers", 168 "CN": "Gpu渲染完成后,提交给RSHardwareThread进行合成。合成有两种方式:(1)GPU合成(Redras) (2)DSS硬件合成(HWC)。当前的合成策略为优先采取硬件合成,若无法通过硬件合成,则使用GPU合成。华为视频播放场景可以关注一下,这个场景下正常是走硬件合成,不走GPU,否则会造成GPU功耗过高。需要打开RS的debug,出现CreateLayer:componentIdSurface XYWH并且HardWareThread没有redraw,如果HardWareThread出现redraw也是走GPU了", 169 "EN": "this is an english translate for CN", 170 "flag": "0" 171 }, 172 { 173 "slice": "ML:cmobe_v3_compile_multiple_shaders", 174 "CN": "触发了shader编译,需要通过与之shader来避免。shader缓存是业界通用方案,在动效前几次执行的时候会概率性出现,用于创建该场景的着色器并将其缓存,以使之后的操作可以直接复用原有的着丝琪,从而提升系统的性能。但shader编译耗时太长导致RS侧丢帧造成动效卡顿", 175 "EN": "this is an english translate for CN", 176 "flag": "0" 177 }, 178 { 179 "slice": "OnVsyncEvent now", 180 "CN": "收到Vsync信号,渲染流程开始", 181 "EN": "this is an english translate for CN", 182 "flag": "0" 183 }, 184 { 185 "slice": "UITaskScheduler::FlushTask", 186 "CN": "刷新UI界面,包括布局、渲染和动画等", 187 "EN": "this is an english translate for CN", 188 "flag": "0" 189 }, 190 { 191 "slice": "FlushMessages", 192 "CN": "发送消息通知图形侧进行渲染", 193 "EN": "this is an english translate for CN", 194 "flag": "0" 195 }, 196 { 197 "slice": "FlushRenderTask", 198 "CN": "总渲染任务执行", 199 "EN": "this is an english translate for CN", 200 "flag": "0" 201 }, 202 { 203 "slice": "Layout", 204 "CN": "节点布局", 205 "EN": "this is an english translate for CN", 206 "flag": "0" 207 }, 208 { 209 "slice": "FrameNode::RenderTask", 210 "CN": "单个渲染任务执行", 211 "EN": "this is an english translate for CN", 212 "flag": "0" 213 }, 214 { 215 "slice": "ListLayoutAlgorithm::MeasureListItem:", 216 "CN": "计算列表项的布局尺寸", 217 "EN": "this is an english translate for CN", 218 "flag": "0" 219 }, 220 { 221 "slice": "ListLayoutAlgorithm::MeasureListItemGroup:", 222 "CN": "计算列表ListItemGroup项的布局尺寸", 223 "EN": "this is an english translate for CN", 224 "flag": "0" 225 }, 226 { 227 "slice": "HandleDragStart, id:", 228 "CN": "拖拽开始", 229 "EN": "this is an english translate for CN", 230 "flag": "0" 231 }, 232 { 233 "slice": "HandleDragUpdate, mainDelta", 234 "CN": "拖拽中", 235 "EN": "this is an english translate for CN", 236 "flag": "0" 237 }, 238 { 239 "slice": "HandleDragEnd, mainPosition:", 240 "CN": "拖拽结束", 241 "EN": "this is an english translate for CN", 242 "flag": "0" 243 }, 244 { 245 "slice": "Scrollable friction animation start,", 246 "CN": "抛滑动画开始", 247 "EN": "this is an english translate for CN", 248 "flag": "0" 249 }, 250 { 251 "slice": "Scrollable friction animation finish, id:", 252 "CN": "抛滑动画结束", 253 "EN": "this is an english translate for CN", 254 "flag": "0" 255 }, 256 { 257 "slice": "StopFrictionAnimation, id:", 258 "CN": "关闭抛滑动画", 259 "EN": "this is an english translate for CN", 260 "flag": "0" 261 }, 262 { 263 "slice": "Scrollable spring animation start, start:", 264 "CN": "过界回弹动画开始", 265 "EN": "this is an english translate for CN", 266 "flag": "0" 267 }, 268 { 269 "slice": "Scrollable spring animation finish, id:", 270 "CN": "过界回弹动画结束", 271 "EN": "this is an english translate for CN", 272 "flag": "0" 273 }, 274 { 275 "slice": "Scrollable spring animation update, start:", 276 "CN": "更新过界回弹动画开始", 277 "EN": "this is an english translate for CN", 278 "flag": "0" 279 }, 280 { 281 "slice": "StopSpringAnimation, id:", 282 "CN": "关闭过界回弹动画", 283 "EN": "this is an english translate for CN", 284 "flag": "0" 285 }, 286 { 287 "slice": "Scroll snap animation start, start:", 288 "CN": "Scroll的限位动画开始", 289 "EN": "this is an english translate for CN", 290 "flag": "0" 291 }, 292 { 293 "slice": "Scroll snap animation finish, id:", 294 "CN": "Scroll的限位动画结束", 295 "EN": "this is an english translate for CN", 296 "flag": "0" 297 }, 298 { 299 "slice": "List start snap animation, start:", 300 "CN": "List的限位动画开始", 301 "EN": "this is an english translate for CN", 302 "flag": "0" 303 }, 304 { 305 "slice": "List snap animation finish, id:", 306 "CN": "List的限位动画结束", 307 "EN": "this is an english translate for CN", 308 "flag": "0" 309 }, 310 { 311 "slice": "StopSnapAnimation isSnapAnimationStop_:", 312 "CN": "关闭限位动画", 313 "EN": "this is an english translate for CN", 314 "flag": "0" 315 }, 316 { 317 "slice": "APP_LIST_FLING", 318 "CN": "滑动阶段(包括所有的拖拽,抛滑、回弹、滚动控制器动画)", 319 "EN": "this is an english translate for CN", 320 "flag": "0" 321 }, 322 { 323 "slice": "TRAILING_ANIMATION id:", 324 "CN": "动画的拖尾阶段", 325 "EN": "this is an english translate for CN", 326 "flag": "0" 327 }, 328 { 329 "slice": "HandleTouchDown, panDirection:", 330 "CN": "手指按下", 331 "EN": "this is an english translate for CN", 332 "flag": "0" 333 }, 334 { 335 "slice": "HandleTouchUp, isDragging_:", 336 "CN": "手指抬起(新增)", 337 "EN": "this is an english translate for CN", 338 "flag": "0" 339 }, 340 { 341 "slice": "HandleTouchCancel, id:", 342 "CN": "取消手势", 343 "EN": "this is an english translate for CN", 344 "flag": "0" 345 }, 346 { 347 "slice": "ScrollAbort, no OnScrollStart, id:", 348 "CN": "ScrollAbort为true,触发OnScrollStart失败,(一般出现在抛滑后调用滚动控制器启动滚动动画)", 349 "EN": "this is an english translate for CN", 350 "flag": "0" 351 }, 352 { 353 "slice": "OnScrollStart, id:", 354 "CN": "触发OnScrollStart成功", 355 "EN": "this is an english translate for CN", 356 "flag": "0" 357 }, 358 { 359 "slice": "ScrollAbort, no OnScrollStop, id:", 360 "CN": "ScrollAbort为true,触发OnScrollStop失败(一般出现在抛滑后调用滚动控制器启动滚动动画)", 361 "EN": "this is an english translate for CN", 362 "flag": "0" 363 }, 364 { 365 "slice": "OnScrollStop, id:", 366 "CN": "触发OnScrollStop成功", 367 "EN": "this is an english translate for CN", 368 "flag": "0" 369 }, 370 { 371 "slice": "ScrollBy, offset:", 372 "CN": "滚动控制器触发ScrollBy", 373 "EN": "this is an english translate for CN", 374 "flag": "0" 375 }, 376 { 377 "slice": "ScrollTo with animation, position:", 378 "CN": "滚动控制器触发带动画的ScrollTo", 379 "EN": "this is an english translate for CN", 380 "flag": "0" 381 }, 382 { 383 "slice": "ScrollTo without animation, position:", 384 "CN": "滚动控制器触发不带动画的ScrollTo", 385 "EN": "this is an english translate for CN", 386 "flag": "0" 387 }, 388 { 389 "slice": "ScrollPage with animation, position", 390 "CN": "滚动控制器触发带动画的Scrollpage", 391 "EN": "this is an english translate for CN", 392 "flag": "0" 393 }, 394 { 395 "slice": "ScrollPage without animation, position:", 396 "CN": "滚动控制器触发不带动画的Scrollpage", 397 "EN": "this is an english translate for CN", 398 "flag": "0" 399 }, 400 { 401 "slice": "Fling, flingVelocity:", 402 "CN": "滚动控制器触发惯性滚动", 403 "EN": "this is an english translate for CN", 404 "flag": "0" 405 }, 406 { 407 "slice": "Scroll ScrollToEdge scrollEdgeType:", 408 "CN": "Scroll触发ScrollEdge", 409 "EN": "this is an english translate for CN", 410 "flag": "0" 411 }, 412 { 413 "slice": "ScrollToEdge scrollEdgeType:", 414 "CN": "滚动控制器触发的ScrollEdge", 415 "EN": "this is an english translate for CN", 416 "flag": "0" 417 }, 418 { 419 "slice": "ScrollToIndex, index:", 420 "CN": "滚动控制器触发ScrollToIndex", 421 "EN": "this is an english translate for CN", 422 "flag": "0" 423 }, 424 { 425 "slice": "CUSTOM_ANIMATOR_SCROLLER_ANIMATION", 426 "CN": "滚动控制器触发ScrollTo滑动动画", 427 "EN": "this is an english translate for CN", 428 "flag": "0" 429 }, 430 { 431 "slice": "HandleScroll, initOffset:", 432 "CN": "嵌套滚动处理偏移量", 433 "EN": "this is an english translate for CN", 434 "flag": "0" 435 }, 436 { 437 "slice": "HandleScrollVelocity, IsOutOfBoundary:", 438 "CN": "嵌套滚动中处理离手速度", 439 "EN": "this is an english translate for CN", 440 "flag": "0" 441 }, 442 { 443 "slice": "HandleOverScroll, IsOutOfBoundary:", 444 "CN": "离手时处理过界滚动", 445 "EN": "this is an english translate for CN", 446 "flag": "0" 447 }, 448 { 449 "slice": "SCROLLER_FIX_VELOCITY_ANIMATION", 450 "CN": "控制器触发按固定速度滚动到边缘", 451 "EN": "this is an english translate for CN", 452 "flag": "0" 453 }, 454 { 455 "slice": "CheckRestartSpring, sizeDiminished is true, do ProcessSpringUpdate, id:", 456 "CN": "回弹动画期间组件大小被修改导致触发回弹更新动画", 457 "EN": "this is an english translate for CN", 458 "flag": "0" 459 }, 460 { 461 "slice": "CheckRestartSpring, do ProcessScrollOver, id:", 462 "CN": "在静态场景下因组件大小修改原因导致组件处于过界状态,触发回弹动画恢复到未过界状态", 463 "EN": "this is an english translate for CN", 464 "flag": "0" 465 }, 466 { 467 "slice": "ListItemGroup:", 468 "CN": "设置lane的ListItemGroup列表布局", 469 "EN": "this is an english translate for CN", 470 "flag": "0" 471 }, 472 { 473 "slice": "ListItem:", 474 "CN": "设置lane的列表布局", 475 "EN": "this is an english translate for CN", 476 "flag": "0" 477 }, 478 { 479 "slice": "change direction in spring animation and start fling animation, distance::", 480 "CN": "过界回弹动效中出现方向改变,并启动抛滑动效", 481 "EN": "this is an english translate for CN", 482 "flag": "0" 483 }, 484 { 485 "slice": "scrollPause set true to stop ProcessScrollMotion, canOverScroll:", 486 "CN": "抛滑动效期间达成停止条件从而关闭抛滑动效,并触发结束回调(一般出现在快速抛滑过界的场景)", 487 "EN": "this is an english translate for CN", 488 "flag": "0" 489 }, 490 { 491 "slice": "Tabs.onChange index ", 492 "CN": "tabs页面切换后", 493 "EN": "this is an english translate for CN", 494 "flag": "0" 495 }, 496 { 497 "slice": "Tabs/Swiper drag start", 498 "CN": "跟手拖拽开始", 499 "EN": "this is an english translate for CN", 500 "flag": "0" 501 }, 502 { 503 "slice": "Tabs/Swiper drag end", 504 "CN": "跟手拖拽结束", 505 "EN": "this is an english translate for CN", 506 "flag": "0" 507 }, 508 { 509 "slice": "Tabs/Swiper start property animation, X:", 510 "CN": "属性动画开始", 511 "EN": "this is an english translate for CN", 512 "flag": "0" 513 }, 514 { 515 "slice": "Tabs/Swiper finish property animation, X: ", 516 "CN": "属性动画结束", 517 "EN": "this is an english translate for CN", 518 "flag": "0" 519 }, 520 { 521 "slice": "Tabs/Swiper start spring animation", 522 "CN": "回弹动画开始", 523 "EN": "this is an english translate for CN", 524 "flag": "0" 525 }, 526 { 527 "slice": "Tabs/Swiper finish spring animation, offset:", 528 "CN": "回弹动画结束", 529 "EN": "this is an english translate for CN", 530 "flag": "0" 531 }, 532 { 533 "slice": "Tabs/Swiper start translate animation", 534 "CN": "自定义属性动画开始", 535 "EN": "this is an english translate for CN", 536 "flag": "0" 537 }, 538 { 539 "slice": "Tabs/Swiper finish translate animation", 540 "CN": "自定义属性动画结束", 541 "EN": "this is an english translate for CN", 542 "flag": "0" 543 }, 544 { 545 "slice": "FlushVsync", 546 "CN": "刷新视图同步事件,包括记录帧信息、刷新任务、绘制渲染上下文、处理用户输入", 547 "EN": "this is an english translate for CN", 548 "flag": "0" 549 } 550 ] 551}