Administración de búfer de fotogramas del cliente

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 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, los identificadores de los búferes de fotogramas antiguos se liberan cuando se desasignan los datos de pantalla antiguos.

  • Es un cambio de modo de visualización iniciado por SurfaceFlinger, que se produce cuando el usuario cambia la resolución con 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 graves, 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 identificadores 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 SurfaceFlinger realiza 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 nueva asignación de búferes de fotogramas se realiza antes de la desasignación de los búferes de fotogramas antiguos. 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 fuga 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, 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 de gráficos y la memoria de gráficos está llena, el proceso de terceros puede ocupar la memoria de gráficos asignada previamente por un framebuffer, lo que deja memoria insuficiente para la reasignación del framebuffer o, posiblemente, fragmenta el espacio de 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, simplemente desconecta y vuelve a conectar dos pantallas diferentes con 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.