Administración de búfer de fotogramas del cliente

A partir de Android 13, el sistema asigna nuevos búferes de fotogramas, que se usan durante la composición del cliente, 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 en caliente, iniciado por el Hardware Composer (HWC), que ocurre cuando se cambia de una pantalla externa a otra que tiene una resolución predeterminada diferente.

    Durante un evento de conexión en caliente, el HWC libera los identificadores de los búferes de fotogramas antiguos cuando desasigna los datos de pantalla antiguos.

  • Es un cambio de modo de visualización iniciado por SurfaceFlinger que se produce cuando cambias 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 identificadores de los búferes de fotogramas del cliente existentes antes de llamar a setActiveConfig o setActiveConfigWithConstraints.

Para evitar problemas catastróficos, como la fragmentación de la memoria en dispositivos sin suficiente memoria de búfer de fotogramas, HWC debe liberar los identificadores de los búferes de fotogramas antiguos. Esto es fundamental en los siguientes casos:

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

Recomendaciones para la administración de búferes de fotogramas

Si HWC no libera los identificadores de los búferes de fotogramas antiguos a tiempo, la asignación de un nuevo búfer de fotogramas se produce antes de la desasignación del búfer de fotogramas antiguo. 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 identificadores, se puede producir una pérdida de memoria.

Para evitar fallas catastróficas en la asignación, sigue estas recomendaciones:

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

  • Asigna un grupo de memoria dedicado para los búferes de fotogramas que esté separado del resto de la memoria del búfer gráfico. Esto es importante porque un proceso de terceros podría intentar asignar memoria de gráficos entre la desasignación y la reasignación del búfer de fotogramas. Si el búfer de fotogramas usa 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 que previamente asignó un búfer de fotogramas. Esto puede provocar que no haya suficiente memoria para la reasignación del búfer de fotogramas o la fragmentación de la memoria.

Prueba la administración del 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 cambios de resolución de su dispositivo, como se describe a continuación:

  • En el caso de los eventos de conexión en caliente, desconecta y vuelve a conectar dos pantallas diferentes que tengan resoluciones distintas.

  • Para los cambios de modo, usa la prueba ModeSwitchingTestActivity de CTS Verifier para iniciar un cambio de modo y probar el comportamiento de la memoria del búfer de fotogramas. Esta prueba puede identificar visualmente problemas que son difíciles de detectar de forma programática.