Android 13 推出名為 AutoSingleLayer
的新設定,可鎖定未發出信號的緩衝區。這項設定可讓 SurfaceFlinger 在只有單一圖層更新時,鎖定未發出信號的緩衝區。這不適用於跨圖層發生的情況,例如幾何變化或同步交易。
先前,Android 開放原始碼計畫 (AOSP) 中的 debug.sf.latch_unsignaled
標記可讓 SurfaceFlinger 鎖定所有未發出信號的緩衝區,無論用途為何。啟用這項設定可能會導致不良的副作用,例如中斷同步交易,以及等待不完整的緩衝區時凍結整個畫面。
在 AutoSingleLayer
模式中,SurfaceFlinger 只會更新影格中單一介面的緩衝區。這個模式可讓遊戲和其他全螢幕應用程式受益,因為它會鎖定未發出信號的緩衝區,並減少應用程式抖動,同時不受螢幕凍結影響。
AutoSingleLayer 模式設定
在 Android 13 中,AutoSingleLayer
是閂鎖未發出信號緩衝區功能的預設模式。這項模式是由系統屬性 debug.sf.auto_latch_unsignaled
控制。
SurfaceFlinger 會在啟動時讀取 LatchUnsignaledConfig
。可能的設定包括:
LatchUnsignaledConfig::AutoSingleLayer
在這個 AOSP 預設模式中,如果單一圖層在影格中更新,SurfaceFlinger 會允許鎖定未發出信號的緩衝區。更新內容只能包含緩衝區更新,不得有同步交易或幾何圖形變更。根據預設,這個模式會將
debug.sf.auto_latch_unsignaled
設為true
。LatchUnsignaledConfig::Disabled
這個模式會停用未發出信號的閂鎖行為,且只會閂鎖發出信號的交易。這個模式也會停用
AutoSingleLayer
模式。如要設定這個模式,請將debug.sf.latch_unsignaled
和debug.sf.auto_latch_unsignaled
設為false
。LatchUnsignaledConfig::Always
在此模式下,SurfaceFlinger 會鎖定所有未發出信號的緩衝區。如要設定這個模式,請將
debug.sf.latch_unsignaled
設為true
。
測試 AutoSingleLayer
如要測試緩衝區是否已閂鎖但未發出信號,請在 Perfetto 中尋找 SurfaceFlinger 的下列追蹤記錄:
圖 1. Perfetto 中已鎖定但未發出信號的緩衝區追蹤記錄