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_unsignaled
和debug.sf.auto_latch_unsignaled
设置为false
。LatchUnsignaledConfig::Always
在此模式下,所有缓冲区都将锁定为未发出信号。要配置此模式,请将
debug.sf.latch_unsignaled
设置为true
。
测试 AutoSingleLayer
要测试缓冲区是否被锁定为未发出信号,请在 Perfetto 中查找来自 SurfaceFlinger 的以下跟踪信息
图 1. Perfetto 中锁定未发出信号的缓冲区的跟踪信息