使用 AutoSingleLayer 的未信號緩衝區 Latch

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_unsignaleddebug.sf.auto_latch_unsignaled 設為 false

  • LatchUnsignaledConfig::Always

    在此模式下,所有緩衝區都會鎖定未發出信號的狀態。如要設定這個模式,請將 debug.sf.latch_unsignaled 設為 true

測試 AutoSingleLayer

如要測試緩衝區是否已閂鎖但未發出信號,請在 Perfetto 中尋找 SurfaceFlinger 的下列追蹤記錄:

已鎖定但未發出信號的緩衝區追蹤記錄

圖 1. Perfetto 中已鎖定但未發出信號的緩衝區追蹤記錄