tracer ftrace笔记(20)—— Systrace中tag汇总

发布时间 2023-08-19 20:13:38作者: Hello-World3

一、视频显示

1. HW_VSYNC_ON_XXX

(1) 类型

布尔值,1 表示 HW VSYNC 信号开关被打开,0 表示开关被关闭。

(2) 时机

HW VYSNC 硬件信号被打开和关闭的时候。

(3) 解释

HW_VSYNC_ON_XXX 后面的 XXX 一般是一串数字,代表的是 displayid,如果你的机器有外接了显示器,那么可以通过 displayid 来区分不同的屏幕的 HW VSYNC 硬件信号。

HW VSYNC 硬件信号之所以会被一直打开关闭,主要原因是目前 Android Display/Graphic framework 依赖的信号不是硬件信号,而是软件信号——DispSync。HW VSYNC 只是用来做校准,打开的时机是当软件 VSYNC 的误差超过一定阈值以后,DispSync 就会主动打开 HW VSYNC 信号来做校准,(目前是)接收 6 个硬件信号以后就会关闭。

(4) 作用

可以用来作为分析项目前期硬件侧导致的各种 bug 的时间锚点。


2. HW_VSYNC_XXX

(1) 类型

瞬时布尔值,从 1 变成 0 或者 0 变成 1 都表示当前时刻发出了 HW_VSYNC。

(2) 时机

HW VSYNC 硬件信号发出的时候。

(3) 解释

需要说明很重要的一点,从 Systrace 看,HW_VSYNC_XXX 似乎是一个区间,实际上,Systrace 中的 HW_VSYNC_XXX 应该这么解读:
HW_VSYNC_XXX 的值是一个瞬时值,记录的是在当前时刻收到了 HW VSYNC 硬件信号,因此在 Systrace 中,当 HW_VSYNC_XXX 的值从 1 变成 0 或者从 0 变成 1,都代表着收到了 HW VSYNC 信号,类似于示波器中的脉冲信号一样。
当收到硬件的 HW VSYNC 信号之后,HWComposer::onVsync() 这个函数就会被回调,接着这个 displayData.vsyncTraceToggle 的值就会被一直取反,模拟出一个脉冲信号的样子并赋给 HW_VSYNC_XXX。
而前面我们在 HW_VSYNC_ON_XXX 提到的,DispSync 在收到 6 个 HW VSYNC 硬件信号之后就会把 HW VSYNC 关闭,systrace上也是可以看的出来的。

(4) 作用

分析 HW VSYNC 硬件信号会有不发或者乱发的问题。


3. hasClientComposition

(1) 类型

布尔值,1 表示本次合成有 GPU 合成(注意是有 GPU 合成,而不是只有 GPU 合成),0 表示本次合成没有 GPU 合成。

(2) 时机

SurfaceFlinger::doComposition() 的开头。

(3) 解释

SurfaceFlinger 按照合成的硬件不一样,有两种类型:

CLIENT 合成:
又称为 GPU 合成,通过 CompositionEngine(RenderEngine线程) 调用一系列的 OpenGL ES 接口去完成合成的操作。

DEVICE 合成:
又称为 HWC 合成,这种合成方式是使用 Hardware Composer 来进行合成。Hardware Composer 是一种特殊的硬件,在高通平台曾用名为 SDE,现在称为 DPU。

利用 Hardware Composer 来合成优势省电,快速,劣势 Layer 是圆角的、Layer 的总数超过硬件的上限无法使用,其次合成逻辑和策略闭源,如果出现问题只能依赖 vendor 去解决。

(4) 作用

如果发现了本应该是 DEVICE 合成的场景出现了 hasClientComposition 等于 1 的情况,那么就说明合成策略有问题。


4. PrevFrameMissed/PrevGpuFrameMissed/PrevHwcFrameMissed

(1) 类型

布尔值,1 表示上一次的合成有对应的 FrameMissed 类型,0 表示没有。

(2) 时机

SurfaceFlinger 合成 Invalidate 阶段的最开始。

(3) 解释

代表的是 SurfaceFlinger 上一次合成的结果,当 SurfaceFlinger 合成完的帧显示到屏幕上时,present fence 就会 signal。因此 可以认为 present fence signal 相当于一次合成的彻底完成。#########
因此,SurfaceFlinger 在每一次开始被 VSYNC-sf 唤醒的时候,会先检查上次合成的情况,方式就是检查上一次合成的 present fence 有没有 signal。如果没有那么就认为是一个 FrameMissed,并且依据上一次合成的方式是否有 GPU 或者是 HWC 参与,对 GpuFrameMissed 和 HwcFrameMissed 进行置位。

(4) 作用

present fence 没有及时 signal 主要有两种原因:

(1) Display 出问题了。App/游戏的 GPU 负载太高了,导致底层大部分时间都花在了等 GPU 渲染工作完成,延后了 present fence 的 signal,######## 从而导致 FrameMissed。
FrameMissed 目前在 Android 官方有两个作用:

(2) 统计。Android 官方有一个 debug 开关,可以在检测到上一帧有 FrameMissed 出现的时候,跳过本次的合成,######### 留给底层更多的时间去显示。这个初衷是好的,不让底层过于繁忙,通过主动跳过合成来减缓底层的工作量。但是由于跳过合成就相当于主动丢帧,在某些场景下会导致到持续性的掉帧。因此这个开关一般是不会打开的。


5. VSYNC-sf/VSYNC-app

(1) 类型

瞬时布尔值,变化的时候表示该时刻发出了 VSYNC-sf/VSYNC-app 软件信号。

(2) 时机

DispSync 分发的时候。

(3) 解释

是应用渲染/SurfaceFlinger 合成的起点。

(4) 作用

VSYNC-app 和 VSYNC-sf 作为 DispSync 两个分发,是应用渲染/SurfaceFlinger 合成的起点,也是我们分析一个 Systrace 一开始最应该看的地方。如果某一处 VSYNC-sf 没有了,那么就说明该处有丢帧的情况,要么是 SurfaceFlinger 主动丢帧(如前面提到的);要么是 app 没有及时渲染完导致的丢帧。

 

 

 

 

参考:

Systrace 中的这些 tag 究竟是什么意思(一)| 掘金技术征文-双节特别篇:https://juejin.cn/post/6879336157277061133