AutoSingleLayer ile sinyalsiz arabellek kilitleme

Android 13, sinyalsiz arabellekleri kilitlemek 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 tüm sinyalsiz arabellekleri kilitlemesine izin veriyordu. Bu yapılandırmayı etkinleştirdiğinizde, istenmeyen yan etkilere neden olabilir. Örneğin, senkronizasyon işlemlerini bozabilir ve eksik arabellekler beklenirken ekranın tamamını dondurabilir.

AutoSingleLayer modunda SurfaceFlinger, bir karede yalnızca 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, kilitlenmemiş 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, sinyal verilmeyen mandal davranışını devre dışı bırakır ve yalnızca sinyal verilen 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, sinyal verilmeyen tüm arabellekleri kilitler. Bu modu yapılandırmak için debug.sf.latch_unsignaled değerini 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ş sinyalsiz bir arabelleğin izi