Bloqueo de búfer no señalado con AutoSingleLayer, Latching de búfer no señalado con AutoSingleLayer

Android 13 agrega una nueva configuración llamada AutoSingleLayer para bloquear búferes no señalizados. Esta configuración permite que SurfaceFlinger bloquee un búfer no señalizado cuando solo se actualiza una capa, y no para 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 permitía a SurfaceFlinger bloquear todos los buffers no señalizados, independientemente del caso de uso. Cuando esta configuración está habilitada, se producen efectos secundarios no deseados, como interrumpir las transacciones de sincronización y congelar toda la pantalla mientras se esperan buffers incompletos.

Con el modo AutoSingleLayer , solo se actualiza una zona de influencia de una única superficie en un marco. Este modo permite que los juegos y otras aplicaciones de pantalla completa obtengan el beneficio de bloquear los buffers no señalizados y reducir el bloqueo de las aplicaciones sin verse afectados por las congelaciones de la pantalla.

Configuración del modo AutoSingleLayer

En Android 13, AutoSingleLayer es el modo predeterminado para la función de bloqueo del búfer sin señal. Este modo está controlado por la propiedad del sistema debug.sf.auto_latch_unsignaled .

SurfaceFlinger lee LatchUnsignaledConfig en el arranque. Aquí están las posibles configuraciones:

  • LatchUnsignaledConfig::AutoSingleLayer

    En este modo predeterminado de AOSP, se permite bloquear búferes no señalizados cuando se actualiza una sola capa en un marco, y la actualización incluye solo una actualización del búfer sin transacciones de sincronización ni cambios de geometría. En este modo, debug.sf.auto_latch_unsignaled está configurado en true de forma predeterminada.

  • LatchUnsignaledConfig::Disabled

    Este modo deshabilita el comportamiento de bloqueo no señalizado y bloquea solo las transacciones señalizadas. Este modo también desactiva el modo AutoSingleLayer . Para configurar este modo, configure debug.sf.latch_unsignaled y debug.sf.auto_latch_unsignaled en false .

  • LatchUnsignaledConfig::Always

    En este modo, todos los buffers se retienen sin señalizar. Para configurar este modo, establezca debug.sf.latch_unsignaled en true .

Prueba AutoSingleLayer

Para probar si un búfer está bloqueado sin señalizar, busque los siguientes rastros de SurfaceFlinger en Perfetto :

Seguimiento de búfer bloqueado no señalizado

Figura 1. Seguimiento de un búfer no señalizado bloqueado en Perfetto