AutoSingleLayer ile sinyalsiz arabellek kilitleme

Android 13, sinyalsiz arabellekleri kilitlemek için AutoSingleLayer adlı yeni bir yapılandırma ekler. Bu yapılandırma, SurfaceFlinger'ın geometri değişiklikleri veya senkronizasyon işlemleri gibi katmanlar arasında meydana gelen durumlar için değil, yalnızca tek bir katman güncellenirken sinyalsiz bir arabelleği mandallamasına olanak tanır.

Android 13'ten önce, AOSP'deki debug.sf.latch_unsignaled bayrağı, SurfaceFlinger'ın kullanım durumundan bağımsız olarak tüm sinyalsiz arabellekleri mandallamasına olanak tanıyor. Bu konfigürasyon etkinleştirildiğinde senkronizasyon işlemlerinin bozulması, eksik arabelleklerde beklerken tüm ekranın donması gibi istenmeyen yan etkiler ortaya çıkar.

AutoSingleLayer moduyla, bir çerçevede yalnızca tek bir yüzeyin arabelleği güncellenir. Bu mod, oyunların ve diğer tam ekran uygulamaların, sinyalsiz arabellekleri kilitleme avantajından yararlanmasını ve ekran donmalarından etkilenmeden uygulama atılımını azaltmasını sağlar.

AutoSingleLayer modu ayarları

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

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

  • LatchUnsignaledConfig::AutoSingleLayer

    Bu AOSP varsayılan modunda, bir çerçevede tek bir katman güncellendiğinde sinyalsiz arabelleklerin mandallanmasına izin verilir ve güncelleme, hiçbir senkronizasyon işlemi veya geometri değişikliği olmadan yalnızca bir arabellek güncellemesini içerir. Bu modda, debug.sf.auto_latch_unsignaled varsayılan olarak true değerine ayarlıdır.

  • LatchUnsignaledConfig::Disabled

    Bu mod, sinyalsiz mandal davranışını devre dışı bırakır ve yalnızca sinyalli işlemleri kilitler. Bu mod aynı zamanda 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 false olarak ayarlayın.

  • LatchUnsignaledConfig::Always

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

AutoSingleLayer test edin

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

Mandallı sinyalsiz arabelleğin izi

Şekil 1. Perfetto'da mandallı, sinyalsiz bir arabelleğin izi