Latching buffer tanpa sinyal dengan AutoSingleLayer

Android 13 memperkenalkan konfigurasi baru yang disebut AutoSingleLayer untuk mengunci buffer yang tidak diberi sinyal. Konfigurasi ini memungkinkan SurfaceFlinger mengunci buffer yang tidak diberi sinyal saat hanya ada satu lapisan yang diperbarui. Hal ini tidak berlaku untuk kasus yang terjadi di seluruh lapisan, misalnya, perubahan geometri atau transaksi sinkronisasi.

Sebelumnya, flag debug.sf.latch_unsignaled di Android Open Source Project (AOSP) memungkinkan SurfaceFlinger mengunci semua buffer yang tidak diberi sinyal, terlepas dari kasus penggunaannya. Jika diaktifkan, konfigurasi ini dapat menyebabkan efek samping yang tidak diinginkan, misalnya, mengganggu transaksi sinkronisasi dan membekukan seluruh layar saat menunggu buffer yang tidak lengkap.

Dalam mode AutoSingleLayer, SurfaceFlinger hanya memperbarui buffer satu permukaan dalam frame. Mode ini memungkinkan game dan aplikasi layar penuh lainnya mendapatkan manfaat dari penguncian buffer yang tidak diberi sinyal dan mengurangi jank aplikasi sekaligus tidak terpengaruh oleh pembekuan layar.

Setelan mode AutoSingleLayer

Untuk Android 13, AutoSingleLayer adalah mode default untuk fitur buffer yang tidak diberi sinyal latch. Mode ini dikontrol oleh properti sistem debug.sf.auto_latch_unsignaled.

SurfaceFlinger membaca LatchUnsignaledConfig saat booting. Konfigurasi yang mungkin adalah:

  • LatchUnsignaledConfig::AutoSingleLayer

    Dalam mode default AOSP ini, SurfaceFlinger mengizinkan penguncian buffer yang tidak diberi sinyal saat satu lapisan diupdate dalam frame. Pembaruan hanya boleh mencakup pembaruan buffer tanpa transaksi sinkronisasi atau perubahan geometri. Secara default, mode ini menetapkan debug.sf.auto_latch_unsignaled ke true.

  • LatchUnsignaledConfig::Disabled

    Mode ini menonaktifkan perilaku tidak diberi sinyal latch dan hanya mengunci transaksi yang diberi sinyal. Mode ini juga menonaktifkan mode AutoSingleLayer. Untuk mengonfigurasi mode ini, tetapkan debug.sf.latch_unsignaled dan debug.sf.auto_latch_unsignaled ke false.

  • LatchUnsignaledConfig::Always

    Dalam mode ini, SurfaceFlinger mengunci semua buffer yang tidak diberi sinyal. Untuk mengonfigurasi mode ini, setel debug.sf.latch_unsignaled ke true.

Menguji AutoSingleLayer

Untuk menguji apakah buffer dikunci tanpa sinyal, cari rekaman aktivitas berikut dari SurfaceFlinger di Perfetto:

Trace buffer yang tidak diberi sinyal dan di-latch

Gambar 1. Rekaman aktivitas buffer yang tidak diberi sinyal dan di-latch di Perfetto