Cómo bloquear búferes sin indicar con AutoSingleLayer

En Android 13, se presenta una nueva configuración llamada AutoSingleLayer para bloquear búferes sin indicar. Esta configuración permite que SurfaceFlinger bloquee un búfer sin indicar cuando se actualiza una sola capa. No se aplica a los casos que ocurren entre capas, por ejemplo, cambios de geometría o transacciones de sincronización.

Anteriormente, la marca debug.sf.latch_unsignaled en el Proyecto de código abierto de Android (AOSP) permitía que SurfaceFlinger bloqueara todos los búferes sin indicar, independientemente del caso de uso. Cuando habilitas esta configuración, puede causar efectos secundarios no deseados, por ejemplo, interrumpir las transacciones de sincronización y congelar toda la pantalla mientras se espera que se completen los búferes.

En el modo AutoSingleLayer, SurfaceFlinger actualiza solo un búfer de una sola superficie en un fotograma. Este modo permite que los juegos y otras apps de pantalla completa se beneficien del bloqueo de búferes sin indicar y reduzcan el jank de la app sin que se vean afectados por las congelaciones de pantalla.

Configuración del modo AutoSingleLayer

Para Android 13, AutoSingleLayer es el modo predeterminado para la función de bloqueo de búferes sin indicar. Este modo se controla con la propiedad del sistema debug.sf.auto_latch_unsignaled.

SurfaceFlinger lee LatchUnsignaledConfig durante el arranque. Las configuraciones posibles son las siguientes:

  • LatchUnsignaledConfig::AutoSingleLayer

    En este modo predeterminado de AOSP, SurfaceFlinger permite bloquear búferes sin indicar cuando se actualiza una sola capa en un fotograma. La actualización debe incluir solo una actualización de búfer sin transacciones de sincronización ni cambios de geometría. De forma predeterminada, este modo establece debug.sf.auto_latch_unsignaled en true.

  • LatchUnsignaledConfig::Disabled

    Este modo inhabilita el comportamiento de bloqueo sin indicar y solo bloquea las transacciones indicadas. Este modo también inhabilita el modo AutoSingleLayer. Para configurar este modo, establece debug.sf.latch_unsignaled y debug.sf.auto_latch_unsignaled en false.

  • LatchUnsignaledConfig::Always

    En este modo, SurfaceFlinger bloquea todos los búferes sin indicar. Para configurar este modo, establece debug.sf.latch_unsignaled en true.

Prueba AutoSingleLayer

Para probar si un búfer está bloqueado sin indicar, busca los siguientes seguimientos de SurfaceFlinger en Perfetto:

Registro del búfer bloqueado sin indicar

Figura 1: Seguimiento de un búfer bloqueado sin indicar en Perfetto