Android 13 添加了一個名為AutoSingleLayer
新配置,用於鎖定無信號緩衝區。此配置允許 SurfaceFlinger 在僅更新單個層時鎖定無信號緩衝區,而不是在跨層發生的情況下(例如幾何更改或同步事務)。
在 Android 13 之前,AOSP 中的debug.sf.latch_unsignaled
標誌可讓 SurfaceFlinger 鎖存所有無信號緩衝區,無論使用情況如何。啟用此配置後,會出現不需要的副作用,例如在等待不完整的緩衝區時中斷同步事務和凍結整個顯示。
使用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 中鎖存無信號緩衝區的跟踪