使用 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 中鎖存無信號緩衝區的跟踪