Penempelan 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 tanpa sinyal saat hanya satu lapisan yang diperbarui, dan bukan 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 buffering yang tidak diberi sinyal, terlepas dari kasus penggunaannya. Jika konfigurasi ini diaktifkan, akan ada efek samping yang tidak diinginkan, seperti memecah transaksi sinkronisasi dan membekukan seluruh tampilan saat menunggu buffer yang tidak lengkap.

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

Setelan mode AutoSingleLayer

Di Android 13, AutoSingleLayer adalah mode default untuk fitur latch buffer tanpa sinyal. Mode ini dikontrol oleh properti sistem debug.sf.auto_latch_unsignaled.

SurfaceFlinger membaca LatchUnsignaledConfig saat booting. Berikut adalah kemungkinan konfigurasinya:

  • LatchUnsignaledConfig::AutoSingleLayer

    Dalam mode default AOSP ini, buffering yang tidak diberi sinyal diizinkan saat satu lapisan diperbarui dalam frame, dan update hanya menyertakan update buffer tanpa transaksi sinkronisasi atau perubahan geometri. Dalam mode ini, debug.sf.auto_latch_unsignaled ditetapkan ke true secara default.

  • LatchUnsignaledConfig::Disabled

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

  • LatchUnsignaledConfig::Always

    Dalam mode ini, semua buffering tidak diberi sinyal. Untuk mengonfigurasi mode ini, setel debug.sf.latch_unsignaled ke true.

Menguji AutoSingleLayer

Untuk menguji apakah buffering tidak diberi sinyal, cari rekaman aktivitas berikut dari SurfaceFlinger di Perfetto:

Rekaman aktivitas buffer yang tidak diberi sinyal dan terkunci

Gambar 1. Rekaman aktivitas buffering tanpa sinyal di Perfetto