AutoSingleLayer ile sinyalsiz arabellek kilitleme

Android 13, sinyal verilmeyen arabelleklerin kilitlenmesi için AutoSingleLayer adlı yeni bir yapılandırma ekler. Bu yapılandırma, yalnızca tek bir katman güncellenirken SurfaceFlinger'in sinyalsiz bir arabelleği kilitlemesine olanak tanır. Geometri değişiklikleri veya senkronizasyon işlemleri gibi katmanlar arasında gerçekleşen durumlar için geçerli değildir.

Android 13'ten önce, AOSP'deki debug.sf.latch_unsignaled işareti, kullanım alanından bağımsız olarak SurfaceFlinger'ın işaretlenmemiş tüm arabellekleri kilitlemesine olanak tanıyordu. Bu yapılandırma etkinleştirildiğinde, senkronizasyon işlemlerinin bozulması ve eksik arabellekler beklenirken ekranın tamamen donması gibi istenmeyen yan etkiler oluşur.

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 arabellekleri kilitleme ve uygulama takılmasını azaltma avantajlarından yararlanmasını sağlar. Bu sırada ekran donmalarından etkilenmezler.

AutoSingleLayer modu ayarları

Android 13'te, mandal sinyalsiz arabellek özelliği için varsayılan mod AutoSingleLayer'dir. Bu mod, debug.sf.auto_latch_unsignaled sistem özelliği tarafından kontrol edilir.

SurfaceFlinger, başlatma 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 olduğunda sinyalsiz arabelleklerin kilitlenmesine izin verilir. Bu modda, debug.sf.auto_latch_unsignaled varsayılan olarak true olarak ayarlanır.

  • LatchUnsignaledConfig::Disabled

    Bu mod, sinyal verilmeyen mandal davranışını devre dışı bırakır ve yalnızca sinyal verilen işlemleri kilitler. 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 değerlerini false olarak ayarlayın.

  • LatchUnsignaledConfig::Always

    Bu modda tüm arabellekler sinyal verilmeden kilitlenir. Bu modu yapılandırmak için debug.sf.latch_unsignaled ayarını true olarak belirleyin.

Test AutoSingleLayer

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

Kilitlenmiş sinyalsiz arabelleğin izi

1. şekil. Perfetto'da kilitlenmiş sinyalsiz bir arabelleğin izi