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_unsignaled
とdebug.sf.auto_latch_unsignaled
をfalse
に設定します。LatchUnsignaledConfig::Always
このモードでは、すべてのバッファが通知なくラッチされます。このモードを設定するには、
debug.sf.latch_unsignaled
をtrue
に設定します。
AutoSingleLayer
のテスト
バッファが通知なくラッチされるかどうかをテストするには、Perfetto の SurfaceFlinger からの次のトレースを探します。
図 1. Perfetto に表示されているラッチされた通知なしバッファのトレース