A partir de Android 13, los búferes de fotogramas nuevos, que se usan durante la composición del cliente, se asignan cada vez que cambia la resolución de pantalla. SurfaceFlinger realiza esta asignación en el siguiente ciclo de invalidación después de un cambio de resolución.
Administración del búfer de fotogramas durante los cambios de resolución
Los cambios de resolución se producen debido a una de las siguientes dos situaciones:
Un evento de conexión y desconexión, que inicia el compositor de hardware (HWC), que se produce cuando se cambia de una pantalla externa a otra que tiene una resolución predeterminada diferente.
Durante un evento de hotplug, se liberan los controladores de los framebuffers anteriores cuando se deallocan los datos de visualización anteriores.
Un interruptor de modo de visualización iniciado por SurfaceFlinger, que ocurre cuando el usuario cambia la resolución con la configuración del usuario o cuando una app cambia la resolución con
preferredDisplayModeId
.Durante un cambio de modo de visualización, SurfaceFlinger libera los controladores de los búferes de tramas de clientes existentes antes de llamar a
setActiveConfig
osetActiveConfigWithConstraints
.
Para evitar problemas catastróficos, como la fragmentación de la memoria, en dispositivos que no reservan suficiente memoria para los búferes de trama nuevos y antiguos, es fundamental que HWC deje de usar los búferes de trama antiguos y libere cualquier control de estos búferes, como se muestra en los siguientes casos:
Para los eventos de hotplug, inmediatamente antes de llamar a
onHotplug
.Para los cambios de modo, inmediatamente después de la llamada a
setActiveConfig
osetActiveConfigWithConstraints
.
La liberación de los controladores permite que la memoria del framebuffer se desasigne por completo antes de la asignación de framebuffers nuevos que realiza SurfaceFlinger durante el siguiente ciclo de invalidación.
Recomendaciones para la administración del búfer de fotogramas
Si HWC no lanza controladores a los búferes de fotogramas anteriores a tiempo, la nueva asignación del búfer de fotogramas se realiza antes de la antigua asignación del búfer de fotogramas. Esto puede causar problemas catastróficos cuando la nueva asignación falla debido a la fragmentación o a otros problemas. Peor aún, si HWC no libera estos controladores, se puede producir una fuga de memoria.
Para evitar fallas catastróficas de asignación, sigue estas recomendaciones:
Si HWC necesita seguir usando los framebuffers de cliente anteriores hasta que se proporcionen los nuevos, es fundamental reservar suficiente memoria para los framebuffers anteriores y nuevos, y posiblemente ejecutar algoritmos de desfragmentación en el espacio de memoria del framebuffer.
Asigna un conjunto 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 la reasignación de los búferes de fotogramas, un proceso de terceros puede intentar asignar memoria gráfica. Si el framebuffer usa el mismo grupo de memoria gráfica y la memoria gráfica está llena, el proceso de terceros puede ocupar la memoria gráfica que asignó un framebuffer anteriormente, lo que deja memoria insuficiente para la reasignación del framebuffer o, posiblemente, fragmenta el espacio de memoria.
Prueba la administración de búfer de fotogramas
Se recomienda a los OEM que prueben la administración adecuada de la memoria del búfer de fotogramas del cliente en los interruptores de resolución de su dispositivo, como se describe a continuación:
Para los eventos de conexión en caliente, simplemente desconecta y vuelve a conectar dos pantallas diferentes con resoluciones diferentes.
Para los cambios de modo, usa la prueba del verificador de CTS
ModeSwitchingTestActivity
para iniciar un cambio de modo y probar el comportamiento de la memoria del búfer de tramas. Esta prueba puede identificar visualmente problemas que son difíciles de detectar de manera programática.