使用 AutoSingleLayer 處理的緩衝區延遲

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 中未發出信號的緩衝區記錄