Gestión del búfer de fotogramas del cliente

A partir de Android 13, los nuevos framebuffers, que se usan durante la composición del cliente , se asignan cada vez que cambia la resolución de la pantalla. Esta asignación la realiza SurfaceFlinger en el siguiente ciclo de invalidación después de un cambio de resolución.

Gestión de framebuffer durante los cambios de resolución

Los cambios de resolución se producen debido a uno de los dos escenarios siguientes:

  • Un evento de conexión en caliente , iniciado por Hardware Composer (HWC), que ocurre cuando se cambia de una pantalla externa a una pantalla externa diferente que tiene una resolución predeterminada diferente.

    Durante un evento de conexión en caliente, los identificadores de los búferes de fotogramas antiguos se liberan cuando se desasignan los datos de visualización antiguos.

  • Un cambio de modo de visualización iniciado por SurfaceFlinger, que ocurre cuando el usuario cambia la resolución con la configuración del usuario , o una aplicación cambia la resolución con preferredDisplayModeId .

    Durante un cambio de modo de visualización, SurfaceFlinger libera los identificadores de los búferes de fotogramas del cliente existentes antes de llamar setActiveConfig o setActiveConfigWithConstraints .

Para evitar problemas catastróficos, como la fragmentación de la memoria, en dispositivos que no reservan suficiente memoria para los búferes de fotogramas antiguos y nuevos, es fundamental que HWC deje de usar los búferes de fotogramas antiguos y libere los identificadores de estos búferes de fotogramas, como se muestra en los siguientes casos:

Liberar los controles permite que la memoria del búfer de fotogramas se desasigne por completo antes de la asignación de nuevos búferes de fotogramas que realiza SurfaceFlinger durante el siguiente ciclo de invalidación .

Recomendaciones para la gestión de framebuffer

Si HWC no libera los identificadores de los búferes de cuadros antiguos a tiempo, la asignación del búfer de cuadros nuevo se lleva a cabo antes que la desasignación del búfer de cuadros anterior. Esto puede causar problemas catastróficos cuando falla la nueva asignación debido a la fragmentación u otros problemas. Peor aún, si HWC no libera estos controladores en absoluto, puede ocurrir una pérdida de memoria.

Para evitar errores de asignación catastróficos, siga estas recomendaciones:

  • Si HWC necesita continuar usando los búferes de fotogramas del cliente antiguo hasta que se proporcionen los búferes de fotogramas del cliente nuevo, entonces es fundamental reservar suficiente memoria para los búferes de fotogramas antiguos y nuevos, y posiblemente ejecutar algoritmos de desfragmentación en el espacio de memoria del búfer de fotogramas.

  • Asigne un grupo de memoria dedicado para los framebuffers que esté separado del resto de la memoria del búfer gráfico. Esto es importante porque entre la desasignación y reasignación de los framebuffers, un proceso de terceros puede intentar asignar memoria gráfica. Si el búfer de fotogramas utiliza el mismo grupo de memoria de gráficos y si la memoria de gráficos está llena, el proceso de terceros puede ocupar la memoria de gráficos previamente asignada por un búfer de fotogramas, dejando así memoria insuficiente para la reasignación del búfer de fotogramas o, posiblemente, fragmentando el espacio de memoria. .

Probar la gestión del búfer de fotogramas

Se recomienda a los OEM que prueben la gestión adecuada de la memoria del búfer de fotogramas del cliente en los conmutadores de resolución de su dispositivo, como se describe a continuación:

  • Para eventos hotplug, simplemente desconecte y vuelva a conectar dos pantallas diferentes con resoluciones diferentes.

  • Para los cambios de modo, use la prueba ModeSwitchingTestActivity CTS Verifier para iniciar un cambio de modo para probar el comportamiento de la memoria del búfer de cuadros. Esta prueba puede identificar visualmente problemas que son difíciles de detectar mediante programación.