Android 13 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 señalizar, independientemente del caso de uso. Cuando habilitas esta configuración, se pueden producir efectos secundarios no deseados, por ejemplo, se pueden interrumpir las transacciones de sincronización y se puede congelar toda la pantalla mientras se espera a que se completen los búferes.
En el modo AutoSingleLayer
, SurfaceFlinger solo actualiza un búfer de una sola superficie en un fotograma. Este modo permite que los juegos y otras apps de pantalla completa se beneficien de la fijación de búferes sin señal y la reducción de la latencia de la app, sin verse afectados por las interrupciones de la pantalla.
Configuración del modo AutoSingleLayer
En 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 inicio. Las configuraciones posibles son las siguientes:
LatchUnsignaledConfig::AutoSingleLayer
En este modo predeterminado del 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 del búfer sin transacciones de sincronización ni cambios de geometría. De forma predeterminada, este modo establece
debug.sf.auto_latch_unsignaled
entrue
.LatchUnsignaledConfig::Disabled
Este modo inhabilita el comportamiento de cierre sin señal y solo cierra las transacciones señaladas. Este modo también inhabilita el modo
AutoSingleLayer
. Para configurar este modo, establecedebug.sf.latch_unsignaled
ydebug.sf.auto_latch_unsignaled
enfalse
.LatchUnsignaledConfig::Always
En este modo, SurfaceFlinger traba todos los búferes sin señalizar. Para configurar este modo, establece
debug.sf.latch_unsignaled
entrue
.
Prueba AutoSingleLayer
Para probar si un búfer está bloqueado sin señalizar, busca los siguientes registros de SurfaceFlinger en Perfetto:
Figura 1: Registro de un búfer bloqueado sin indicar en Perfetto