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": "FlushLayoutTask",
36            "CN": "组件的布局,这一块可以确认是什么组件在创建或者复用",
37            "EN": "this is an english translate for CN",
38            "flag": "0"
39        },
40        {
41            "slice": "CreateTaskMeasure",
42            "CN": "组件的测量。这一块可以确认是什么组件在创建",
43            "EN": "this is an english translate for CN",
44            "flag": "0"
45        },
46        {
47            "slice": "SendCommands",
48            "CN": "发送绘制指令给图形Render_Service。transactionFalg的坐标可以标识这条指令与Render_Service侧的接收帧对应起来",
49            "EN": "this is an english translate for CN",
50            "flag": "0"
51        },
52        {
53            "slice": "JSAnimation",
54            "CN": "如果FlushVsync下面出现这个trace点,说明触发了ArkUI的动效,例如使用了属性动画animation属性或者显示动画animateTo。可以排查一下代码看一下这种场景是否需要触发这个动画,有时候会因为组件的刷新而出现该动画的冗余绘制",
55            "EN": "this is an english translate for CN",
56            "flag": "0"
57        },
58        {
59            "slice": "BuildRecyle",
60            "CN": "如果出现这个trace说明,这个组件是走复用逻辑的。当前如果组件节点较多,也会导致组件复用的时候耗时比较长导致丢帧。",
61            "EN": "this is an english translate for CN",
62            "flag": "0"
63        },
64        {
65            "slice": "aboutToRecycleInternal",
66            "CN": "标识组件进入复用池。例如我们首页使用cacheCount会将自检及其相关数据都缓存起来,但是一旦触发了DataReload之后缓存就会失效,这时候缓存的组件会进入复用池,等待后面华东的时候触发组件复用。",
67            "EN": "this is an english translate for CN",
68            "flag": "0"
69        },
70        {
71            "slice": "Onldle->List predict:onldle",
72            "CN": "标志Vsync中的空闲,一般会用来做预加载之类的。LIst predict就是列表的预加载。使用CachedCount和lazyForEach都会触发。",
73            "EN": "this is an english translate for CN",
74            "flag": "0"
75        },
76        {
77            "slice": "RunningCustomAnimation",
78            "CN": "自定义动画,RSModifierManager管理的在UI线程运行的动画,例如LoadingProgess、滚动组件的松手滚动、slider的进度条变化动画......后面的num表示动画的数量,如果大于0,则表示有动画在运行,如果遇到需要定位具体的动画,则需要底层增加trace点",
79            "EN": "this is an english translate for CN",
80            "flag": "0"
81        },
82        {
83            "slice": "DispatchDisplaySync",
84            "CN": "使用了displaySync接口进行降帧率处理,TimeStamp和TargetTimestamp分别表示当前帧的事件戳和下一次绘制的时间戳(估算的,并不准确)。Preffered[30]表示设置的期望帧率是30FPS,VsyncRate[120]表示实际Vsync的帧率是120PFS,Rate[4]表示事件送显的帧之间的间隔,noSkip[0]表示false,1表示true,标识这一帧是否需要绘制,0表示这帧跳过绘制,可以看到没有对应的sendCommands;1表示实际绘制送显,有对应的sendCommands的trace点",
85            "EN": "this is an english translate for CN",
86            "flag": "0"
87        },
88        {
89            "slice": "PartialGC::RunPhase",
90            "CN": "触发了内存的GC,有时候会刚好遇上Vsync导致Vsync整体耗时长。当前已经做过优化,对于超过10ms的帧,在10ms后不做GC。但是如果是在Vsync刚开始的时候还是有可能会触发",
91            "EN": "this is an english translate for CN",
92            "flag": "0"
93        },
94        {
95            "slice": "HandleVisibleChangeEvent",
96            "CN": "对应ArkUI的接口OnVisibleChange。ArkUI对于每一帧的Vsync必然会走这个方法的逻辑,即使应用没有使用也会遍历一把,一般耗时在us级。如果耗时几ms,甚至占了Vsync的一半时间,就需要分析一下了,先排查一下该场景是否滥用了OnVisibiChange接口",
97            "EN": "this is an english translate for CN",
98            "flag": "0"
99        },
100        {
101            "slice": "HandleOnAreaChangeEvent",
102            "CN": "对应ArkUI的接口OnareaChange。ArkUI对于每一帧的Vsync必然会走这个方法的逻辑,即使应用没有使用也会遍历一把,一般耗时在us级。如果耗时几ms,甚至占了Vsync的一半时间,就需要分析一下了,先排查一下该场景是否滥用了OnAreaChange接口",
103            "EN": "this is an english translate for CN",
104            "flag": "0"
105        },
106        {
107            "slice": "ViewChangeCallback",
108            "CN": "窗口变化会触发ArkUI的一系列回调,例如横竖屏转换的时候,接收到窗口变化ArkUI会从应用页面Root节点开始进行刷新和重新布局。",
109            "EN": "this is an english translate for CN",
110            "flag": "0"
111        },
112        {
113            "slice": "FlushFocus",
114            "CN": "焦点切换,属于通用事件。每一帧都会打点,如果没有具体处理在几us左右。如果耗时异常,例如页面专场的场景。",
115            "EN": "this is an english translate for CN",
116            "flag": "0"
117        },
118        {
119            "slice": "RSModfierManager Draw num",
120            "CN": "组件属性变更的绘制,如果num不变,持续绘制可能和动画组件的属性变更有关;如果只是一次性绘制,可能就是有些组件属性变更了一次。具体是什么组件引起的,需要动画加trace点继续定位。",
121            "EN": "this is an english translate for CN",
122            "flag": "0"
123        },
124        {
125            "slice": "DispatchTouchEvent",
126            "CN": "应用侧接收到点击事件,并标识了具体的X,Y详细坐标,type是个枚举为0:down、1:up、2:move。可作为应用侧点击类事件的起始点",
127            "EN": "this is an english translate for CN",
128            "flag": "0"
129        },
130        {
131            "slice": "H:UnMarsh",
132            "CN": "RSTransactionData:data size UI侧将要发送的指令序列化后通过IPC与RS通信,RS收到消息后就会对其进行反序列化,解析出对应的命令和数据。如果datasize较小会直接在IPC上进行反序列化,可以通过runnable找到对应的发送序列化的指令的应用侧的帧。如果data size较大,则会创建一个子线程RSUnmarshalThre进行反序列化操作。之前有个问题就是RS的每一帧处理会等反序列化处理完成,会阻塞RS主线程,导致丢帧。后来图形做了处理,旋转场景不等应用的反序列化数据,延迟处理",
133            "EN": "this is an english translate for CN",
134            "flag": "0"
135        },
136        {
137            "slice": "RSMainThread::ProcessCommandUni",
138            "CN": "这个trace点后面会有个坐标点,和应用侧sendCommands发送的指令Flag坐标是一致的,标识这一帧处理对应的应用侧帧的进程号和序列号",
139            "EN": "this is an english translate for CN",
140            "flag": "0"
141        },
142        {
143            "slice": "Animate",
144            "CN": "RS侧的动效,这一块正常也在us级别,有一些动效可能稍微耗时一些例如粒子动效。如果耗时超过2ms可能需要分析一下了。这个trace点里的具体是什么动效引起,需要动效的人增加日志或者trace点进行定位。RequestNextVSync表示动效还有下一帧,还未结束",
145            "EN": "this is an english translate for CN",
146            "flag": "0"
147        },
148        {
149            "slice": "H:RSUniRender:PrepareDisplay",
150            "CN": "预处理,计算各节点的绝对位置,更新各个窗口的脏区。然后再更新屏幕中各个窗口的信息,最后将各个窗口的脏区进行合并",
151            "EN": "this is an english translate for CN",
152            "flag": "0"
153        },
154        {
155            "slice": "H:RSUniRender::Process",
156            "CN": "标识当前参与绘制的应用窗口,并且显示窗口的位置以及大小",
157            "EN": "this is an english translate for CN",
158            "flag": "0"
159        },
160        {
161            "slice": "PureContainerNode/ProcessedNodes",
162            "CN": "容器节点/总结点数。下面的小竖条详细展示了当前应用有多少个节点参与了绘制",
163            "EN": "this is an english translate for CN",
164            "flag": "0"
165        },
166        {
167            "slice": "H:RSFilterCacheManager::DrawFilter",
168            "CN": "当前页面有模糊绘制,模糊数量两个及以上对RS的绘制就会造成较大影响。可以评估一下当前页面模糊的必要性,如果当前页面的多个模糊是必要的,可以考虑是否使用模糊合并。如果场景没法合并可以求助下一图形接口",
169            "EN": "this is an english translate for CN",
170            "flag": "0"
171        },
172        {
173            "slice": "H:RSUniRender:FlushFrame",
174            "CN": "生成渲染指令后交给GPU执行",
175            "EN": "this is an english translate for CN",
176            "flag": "0"
177        },
178        {
179            "slice": "H:RSHardwareThread::CommitAndReleaseLayers",
180            "CN": "Gpu渲染完成后,提交给RSHardwareThread进行合成。合成有两种方式:(1)GPU合成(Redras) (2)DSS硬件合成(HWC)。当前的合成策略为优先采取硬件合成,若无法通过硬件合成,则使用GPU合成。华为视频播放场景可以关注一下,这个场景下正常是走硬件合成,不走GPU,否则会造成GPU功耗过高。需要打开RS的debug,出现CreateLayer:componentIdSurface XYWH并且HardWareThread没有redraw,如果HardWareThread出现redraw也是走GPU了",
181            "EN": "this is an english translate for CN",
182            "flag": "0"
183        },
184        {
185            "slice": "ML:cmobe_v3_compile_multiple_shaders",
186            "CN": "触发了shader编译,需要通过与之shader来避免。shader缓存是业界通用方案,在动效前几次执行的时候会概率性出现,用于创建该场景的着色器并将其缓存,以使之后的操作可以直接复用原有的着丝琪,从而提升系统的性能。但shader编译耗时太长导致RS侧丢帧造成动效卡顿",
187            "EN": "this is an english translate for CN",
188            "flag": "0"
189        }
190    ]
191}