Latching buffer tanpa sinyal dengan AutoSingleLayer

Android 13 menambahkan konfigurasi baru yang disebut AutoSingleLayer untuk mengunci buffer yang tidak diberi sinyal. Konfigurasi ini memungkinkan SurfaceFlinger mengunci buffer yang tidak diberi sinyal saat hanya satu lapisan yang diupdate, dan tidak untuk kasus yang terjadi di seluruh lapisan, seperti perubahan geometri atau transaksi sinkronisasi.

Sebelum Android 13, tanda debug.sf.latch_unsignaled di AOSP memungkinkan SurfaceFlinger mengunci semua buffer yang tidak diberi sinyal, terlepas dari kasus penggunaannya. Jika konfigurasi ini diaktifkan, akan ada efek samping yang tidak diinginkan, seperti merusak transaksi sinkronisasi dan membekukan seluruh tampilan saat menunggu buffer yang tidak lengkap.

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

Setelan mode AutoSingleLayer

Di Android 13, AutoSingleLayer adalah mode default untuk fitur buffer tidak tersinyal penguncian. Mode ini dikontrol oleh properti sistem debug.sf.auto_latch_unsignaled.

SurfaceFlinger membaca LatchUnsignaledConfig saat booting. Berikut adalah kemungkinan konfigurasi:

  • LatchUnsignaledConfig::AutoSingleLayer

    Dalam mode default AOSP ini, buffer yang tidak diberi sinyal dapat di-latch saat satu lapisan diperbarui dalam frame, dan update hanya mencakup update buffer tanpa transaksi sinkronisasi atau perubahan geometri. Dalam mode ini, debug.sf.auto_latch_unsignaled disetel ke true secara default.

  • 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, semua buffer dikunci tanpa sinyal. Untuk mengonfigurasi mode ini, setel debug.sf.latch_unsignaled ke true.

Uji 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