使用 AutoSingleLayer 进行无信号缓冲区锁存

Android 13 添加了一项名为 AutoSingleLayer 的新配置,用于锁存无信号的缓冲区。此配置可让 SurfaceFlinger 在仅有单个层更新时锁存无信号的缓冲区,但不适用于跨层发生的情况,例如几何图形变化或同步事务。

在 Android 13 之前,AOSP 中的 debug.sf.latch_unsignaled 标志允许 SurfaceFlinger 锁存所有无信号的缓冲区(无论在何种使用情形下)。启用此配置会出现一些非预期的附带效应,例如在等待未完成的缓冲区期间破坏同步事务和冻结整个显示屏。

使用 AutoSingleLayer 模式时,只会更新相应帧中单个 Surface 的缓冲区。此模式让游戏和其他全屏应用可锁存无信号的缓冲区并减少应用卡顿,同时不受显示屏冻结的影响。

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 的以下跟踪记录:

已锁存的无信号缓冲区的跟踪记录

图 1. Perfetto 中已锁存的无信号缓冲区的跟踪记录