Penguncian 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 ketika hanya satu lapisan yang diperbarui, dan bukan untuk kasus yang terjadi di seluruh lapisan, seperti perubahan geometri atau transaksi sinkronisasi.

Sebelum Android 13, flag debug.sf.latch_unsignaled di AOSP memungkinkan SurfaceFlinger mengunci semua buffer yang tidak diberi sinyal, apa pun kasus penggunaannya. Ketika konfigurasi ini diaktifkan, terdapat efek samping yang tidak diinginkan, seperti terputusnya transaksi sinkronisasi dan membekukan seluruh tampilan saat menunggu buffer yang tidak lengkap.

Dengan mode AutoSingleLayer , hanya buffer dari satu permukaan yang diperbarui dalam satu bingkai. Mode ini memungkinkan game dan aplikasi layar penuh lainnya mendapatkan manfaat dari mengunci buffer yang tidak diberi sinyal dan mengurangi jank aplikasi namun tetap tidak terpengaruh oleh tampilan yang macet.

Pengaturan mode AutoSingleLayer

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

SurfaceFlinger membaca LatchUnsignaledConfig saat boot. Berikut adalah konfigurasi yang mungkin:

  • LatchUnsignaledConfig::AutoSingleLayer

    Dalam mode default AOSP ini, penguncian buffer yang tidak diberi sinyal diizinkan ketika satu lapisan diperbarui dalam sebuah bingkai, dan pembaruan hanya mencakup pembaruan 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 latch unsignaled 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 buffer terkunci tanpa sinyal. Untuk mengonfigurasi mode ini, setel debug.sf.latch_unsignaled ke true .

Uji AutoSingleLayer

Untuk menguji apakah buffer terkunci tanpa sinyal, cari jejak berikut dari SurfaceFlinger di Perfetto :

Jejak buffer tak sinyal yang terkunci

Gambar 1. Jejak buffer tak sinyal yang terkunci di Perfetto