使用 AutoSingleLayer 進行無信號緩衝區鎖存

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

  • LatchUnsignaledConfig::Always

    在此模式下,所有緩衝區均被鎖存且無訊號。若要配置此模式,請將debug.sf.latch_unsignaled設為true

測試AutoSingleLayer

若要測試緩衝區是否處於無訊號鎖定狀態,請在Perfetto中的 SurfaceFlinger 中尋找以下追蹤:

鎖存無訊號緩衝區的跟踪

圖 1. Perfetto 中鎖存無訊號緩衝區的追蹤