Android 13 agrega una nueva configuración llamada AutoSingleLayer
para bloquear búferes sin señalizar. Esta configuración permite que SurfaceFlinger bloquee un búfer no señalado cuando solo se actualiza una sola capa, y no en los casos que ocurren entre capas, como cambios de geometría o transacciones de sincronización.
Antes de Android 13, el indicador debug.sf.latch_unsignaled
en AOSP permite que SurfaceFlinger bloquee todos los búferes sin señalizar, independientemente del caso de uso. Cuando esta configuración está habilitada, hay efectos secundarios no deseados, como interrumpir las transacciones de sincronización y congelar toda la pantalla mientras se esperan búferes incompletos.
Con el modo AutoSingleLayer
, solo se actualiza un búfer de una sola superficie en un marco. Este modo permite que los juegos y otras aplicaciones de pantalla completa obtengan el beneficio de bloquear los búferes no señalados y reducir el bloqueo de la aplicación sin verse afectado por los bloqueos de pantalla.
Configuración del modo AutoSingleLayer
En Android 13, AutoSingleLayer
es el modo predeterminado para la función de búfer sin señalizar de pestillo. Este modo está controlado por la propiedad del sistema debug.sf.auto_latch_unsignaled
.
SurfaceFlinger lee LatchUnsignaledConfig
en el arranque. Estas son las configuraciones posibles:
LatchUnsignaledConfig::AutoSingleLayer
En este modo predeterminado de AOSP, se permite enclavar búferes no señalados cuando se actualiza una sola capa en un marco, y la actualización incluye solo una actualización de búfer sin transacciones de sincronización ni cambios de geometría. En este modo,
debug.sf.auto_latch_unsignaled
se establece entrue
de forma predeterminada.LatchUnsignaledConfig::Disabled
Este modo desactiva el comportamiento no señalado del pestillo y bloquea solo las transacciones señaladas. Este modo también desactiva el modo
AutoSingleLayer
. Para configurar este modo, establezcadebug.sf.latch_unsignaled
ydebug.sf.auto_latch_unsignaled
enfalse
.LatchUnsignaledConfig::Always
En este modo, todos los búferes se bloquean sin señalizar. Para configurar este modo, establezca
debug.sf.latch_unsignaled
entrue
.
Prueba AutoSingleLayer
Para probar si un búfer está bloqueado sin señalizar, busque los siguientes rastros de SurfaceFlinger en Perfetto :
Figura 1. Rastreo de un búfer no señalado bloqueado en Perfetto