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_unsignaledfalse に設定します。

  • LatchUnsignaledConfig::Always

    このモードでは、すべてのバッファが通知なくラッチされます。このモードを設定するには、debug.sf.latch_unsignaledtrue に設定します。

AutoSingleLayer のテスト

バッファが通知なくラッチされるかどうかをテストするには、Perfetto の SurfaceFlinger からの次のトレースを探します。

ラッチされた通知なしバッファのトレース

図 1. Perfetto に表示されているラッチされた通知なしバッファのトレース