AutoSingleLayer ile sinyalsiz arabellek kilitleme

Android 13, sinyalsiz arabelleklerin kilitlenmesi için AutoSingleLayer adlı yeni bir yapılandırma sunar. Bu yapılandırma, yalnızca tek bir katman güncellenirken SurfaceFlinger'ın sinyalsiz bir arabelleği kilitlemesine olanak tanır. Katmanlar arasında gerçekleşen durumlar (ör. geometri değişiklikleri veya senkronizasyon işlemleri) için geçerli değildir.

Daha önce Android Açık Kaynak Projesi'ndeki (AOSP) debug.sf.latch_unsignaled işareti, kullanım alanından bağımsız olarak SurfaceFlinger'in sinyal verilmeyen tüm arabellekleri kilitlemesine izin veriyordu. Bu yapılandırmayı etkinleştirdiğinizde istenmeyen yan etkiler (ör. senkronizasyon işlemlerinin bozulması ve eksik arabellekler beklenirken ekranın donması) oluşabilir.

AutoSingleLayer modunda SurfaceFlinger, bir karedeki tek bir yüzeyin arabelleğini günceller. Bu mod, oyunların ve diğer tam ekran uygulamaların, sinyalsiz arabellekleri kilitleyip uygulama takılmasını azaltarak ekran donmalarından etkilenmeden yararlanmasını sağlar.

AutoSingleLayer modu ayarları

Android 13'te AutoSingleLayer, kilitlenmiş sinyalsiz arabellek özelliği için varsayılan moddur. 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 SurfaceFlinger, bir karede tek bir katman güncellendiğinde sinyalsiz arabelleklerin kilitlenmesine izin verir. Güncelleme yalnızca senkronizasyon işlemleri veya geometri değişiklikleri içermeyen bir arabellek güncellemesi olmalıdır. Bu mod, varsayılan olarak debug.sf.auto_latch_unsignaled değerini true olarak ayarlar.

  • LatchUnsignaledConfig::Disabled

    Bu mod, kilitlenmenin sinyalsiz davranışını devre dışı bırakır ve yalnızca sinyalli işlemleri kilitler. Bu modda AutoSingleLayer modu da devre dışı bırakılı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 SurfaceFlinger, sinyalsiz tüm arabellekleri kilitler. Bu modu yapılandırmak için debug.sf.latch_unsignaled seçeneğini true olarak ayarlayın.

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

Şekil 1. Perfetto'da kilitlenmiş, sinyal verilmeyen bir arabelleğin izi