AutoSingleKatman ile sinyalsiz arabellek engelleme

Android 13, sinyalsiz arabellekleri kilitlemek için AutoSingleLayer adlı yeni bir yapılandırma ekler. Bu yapılandırma, SurfaceFlinger'ın yalnızca tek bir katman güncellenirken sinyalsiz bir arabellek kilitlemesine olanak tanır. Katmanlar arasında gerçekleşen geometri değişiklikleri veya senkronizasyon işlemleri gibi durumlar için bu yapılandırma geçerli değildir.

Android 13'ten önce AOSP'deki debug.sf.latch_unsignaled işaretçisi, kullanım alanından bağımsız olarak SurfaceFlinger'ın tüm sinyalsiz arabellekleri kilitlemesine olanak tanır. Bu yapılandırma etkinleştirildiğinde, senkronizasyon işlemlerinin kesilmesi ve tamamlanmamış arabellekler beklenirken ekranın tamamının donması gibi istenmeyen yan etkiler ortaya çıkar.

AutoSingleLayer modunda, bir karede yalnızca tek bir yüzeyin arabelleği güncellenir. Bu mod, oyunların ve diğer tam ekran uygulamaların, sinyalsiz arabelleklerin kilitlenmesi ve uygulamadaki takılmaların azaltılması avantajlarından yararlanmasına olanak tanır.

AutoSingleLayer modu ayarları

Android 13'te, AutoSingleLayer, mandallı sinyalsiz arabellek özelliğinin varsayılan modudur. Bu mod, debug.sf.auto_latch_unsignaled sistem mülkü tarafından kontrol edilir.

SurfaceFlinger, önyükleme sırasında LatchUnsignaledConfig dosyasını okur. Olası yapılandırmalar şunlardır:

  • LatchUnsignaledConfig::AutoSingleLayer

    Bu AOSP varsayılan modunda, bir karede tek bir katman güncellendiğinde ve güncelleme yalnızca senkronizasyon işlemleri veya geometri değişiklikleri içermeyen bir arabellek güncellemesi içerdiğinde sinyalsiz arabelleklerin kilitlenmesine izin verilir. Bu modda debug.sf.auto_latch_unsignaled, varsayılan olarak true olarak ayarlanır.

  • LatchUnsignaledConfig::Disabled

    Bu mod, sinyalsiz mandallama davranışını devre dışı bırakır ve yalnızca sinyal verilen işlemleri mandallar. Bu mod, AutoSingleLayer modunu da devre dışı bırakır. Bu modu yapılandırmak için debug.sf.latch_unsignaled ve debug.sf.auto_latch_unsignaled'i false olarak ayarlayın.

  • LatchUnsignaledConfig::Always

    Bu modda, tüm tamponlar sinyalsiz olarak kilitlenir. Bu modu yapılandırmak için debug.sf.latch_unsignaled değerini true olarak ayarlayın.

AutoSingleLayer testi

Bir arabelleğin sinyalsiz olarak kilitlenip kilitlenmediğini test etmek için Perfetto'da SurfaceFlinger'dan gelen aşağıdaki izleri arayın:

Kilitli, sinyalsiz arabelleğin izlemesi

Şekil 1. Perfetto'da kilitli, sinyalsiz bir arabelleğin izlemesi