SurfaceFlinger 转储可提供特定时间的 SurfaceFlinger 快照。SurfaceFlinger 轨迹包含按时间顺序排列的状态,可提供有关窗口如何在屏幕上显示的宝贵洞见,并确定在特定位置收到触摸响应的窗口。这些信息对于排查问题(例如应用不响应我的轻触或我在观看视频时遇到了闪烁问题)至关重要。
Winscope 的 SurfaceFlinger 查看器会针对使用活动模式收集的轨迹或在生成 bug 报告(默认为 Droidfood 配置)时从事务轨迹生成的轨迹,以及转储显示此信息。
如需详细了解轨迹收集,请参阅 SurfaceFlinger(层)。
图 1. SurfaceFlinger 轨迹分析。
屏幕左侧显示的是层的 3D 视图。矩形视图会考虑图层边界、Z 顺序、不透明度、相对 Z 和圆角。
层次结构条状标签
该标签页的中央部分会显示图层层次结构,并带有条状标签,用于显示更多信息,例如图层之间的父子关系,如下所示:
- V:标识可见图层。
- RelZParent:标识具有 RelZ 子项的图层。
- RelZ:用于标识具有 RelZParent 且按 z 顺序绘制的图层及其层次结构。
- HWC:标识由硬件混合渲染器合成的层。
- GPU:标识由 GPU 组成的图层。
屏幕右侧列出了精选的属性,以及所有可用图层属性的 Proto 转储。如需详细了解 proto 转储部分的功能,请参阅属性。
精选房源
为了简化调试,SurfaceFlinger 查看器提供了精选的属性列表,以更有条理的格式显示最常用的信息:
图 2. SurfaceFlinger 属性。
此列表包含以下类别。
可见性
此块包含有关图层可见性的信息,以及有关其不可见原因的说明。其中包括:
标志:用于控制可见性,例如 HIDDEN
和 OPAQUE
。
不可见原因:说明层或 Surface 在屏幕上不可见的原因(如果适用),例如,被自身或其父级隐藏,或者没有可绘制的缓冲区。
遮挡、部分遮挡或被遮挡:
- 被遮挡:系统会将当前图层计算为可见,但在其上方绘制另一个不透明图层,使当前图层不可见。遮挡层上方的图层不透明,也就是说,其
OPAQUE
标志已设置,或者像素格式不包含 Alpha,或者未在图层上设置 Alpha。 - 部分遮挡:由于在当前图层上绘制的不透明图层未完全覆盖它,因此当前图层是部分可见的。部分遮挡层上方的图层不透明,即已设置
OPAQUE
标志,或者像素格式不包含 Alpha 值,或者未在图层上设置 Alpha 值。 已覆盖:当前图层被非不透明图层完全或部分覆盖,但可能仍在屏幕上显示。Covered 层上方的层不透明,即未设置
OPAQUE
标志,或像素格式包含 Alpha 值,或在该层上设置了 Alpha 值。不过,对于 SurfaceFlinger 轨迹,SurfaceFlinger 下方的被覆盖层会显示为可见:图 3. SurfaceFlinger 上的已覆盖层。
几何图形和效果
本部分介绍了当前图层的请求和计算的几何图形和效果。
Requested 部分会显示在图层上设置的属性。与之相反,计算部分会显示应用于图层的属性。之所以有这种区别,是因为几何图形和效果会向下传递到层次结构中,并从父元素继承。
在图 2 中,图层请求将圆角半径设置为 0 像素。不过,其父图层之一将圆角半径设置为 97.419 px,这是应用的值:
缓冲区
以下属性会显示有关图层是否具有缓冲区、其大小和转换的信息。
- 帧编号:从应用创建时开始的增量编号。
- 目标帧:用于将缓冲区缩放到目标帧定义的边界。
层次结构
以下属性介绍了如何确定图层的层次结构:
- z 轴顺序:在图层层次结构中,z 轴顺序决定了某个图层相对于其同级兄弟图层的相对位置。z 值为 0 的图层位于其父级之上。如果多个图层具有相同的 z 值,则图层 ID 较高的图层会位于顶部。
- 相对父级:表示 z 顺序中的相对父级图层。子项不会继承其相对父项的任何属性,但会继承“已隐藏”标志。
输入
以下属性包含有关可触摸区域和焦点的信息:
- 使用项剪裁触摸区域:使用图层边界剪裁可触摸区域。
- 将触摸区域替换为剪裁区域:使用当前图层剪裁区域作为其可触摸区域。