使用 AutoSingleLayer 的无信号缓冲区锁存

Android 13 添加了一个名为 AutoSingleLayer 的新配置,用于锁存无信号缓冲区。此配置允许 SurfaceFlinger 仅在单个图层更新时锁存无信号缓冲区,而不会在跨图层发生的情况(例如几何图形更改或同步事务)中锁存。

在 Android 13 之前,AOSP 中的 debug.sf.latch_unsignaled 标志允许 SurfaceFlinger 锁存所有无信号缓冲区,而与用例无关。启用此配置后,会出现不良副作用,例如破坏同步事务并在等待不完整的缓冲区时冻结整个显示屏。

使用 AutoSingleLayer 模式,每帧仅更新单个表面的缓冲区。此模式使游戏和其他全屏应用能够受益于锁定未发出信号的缓冲区并减少应用卡顿,同时不受显示冻结的影响。

AutoSingleLayer 模式设置

在 Android 13 中,AutoSingleLayer 是锁定未发出信号的缓冲区功能的默认模式。此模式由系统属性 debug.sf.auto_latch_unsignaled 控制。

SurfaceFlinger 在启动时读取 LatchUnsignaledConfig。以下是可能的配置:

  • LatchUnsignaledConfig::AutoSingleLayer

    在此 AOSP 默认模式下,当每帧仅更新单个图层,且更新仅包含缓冲区更新,不包含同步事务或几何图形更改时,允许锁定未发出信号的缓冲区。在此模式下,debug.sf.auto_latch_unsignaled 默认设置为 true

  • LatchUnsignaledConfig::Disabled

    此模式禁用锁定未发出信号的行为,并且仅锁定已发出信号的事务。此模式还会禁用 AutoSingleLayer 模式。要配置此模式,请将 debug.sf.latch_unsignaleddebug.sf.auto_latch_unsignaled 设置为 false

  • LatchUnsignaledConfig::Always

    在此模式下,所有缓冲区都将锁定为未发出信号。要配置此模式,请将 debug.sf.latch_unsignaled 设置为 true

测试 AutoSingleLayer

要测试缓冲区是否被锁定为未发出信号,请在 Perfetto 中查找来自 SurfaceFlinger 的以下跟踪信息

Trace of latched unsignaled buffer

图 1. Perfetto 中锁定未发出信号的缓冲区的跟踪信息