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 中鎖存無訊號緩衝區的追蹤