SurfaceFlinger y WindowManager

SurfaceFlinger acepta búferes, los compone y los envía a la pantalla. WindowManager proporciona a SurfaceFlinger búferes y metadatos de ventanas, que SurfaceFlinger usa para combinar superficies en la pantalla.

SurfaceFlinger

SurfaceFlinger puede aceptar búferes de dos maneras: a través de BufferQueue y SurfaceControl, o a través de ASurfaceControl.

Una forma en que SurfaceFlinger acepta búferes es a través de BufferQueue y SurfaceControl. Cuando una app pasa al primer plano, solicita búferes a WindowManager. Luego, WindowManager solicita una capa a SurfaceFlinger. Una capa es una combinación de una superficie, que contiene el BufferQueue, y un SurfaceControl, que contiene los metadatos de la capa, como el marco de visualización. SurfaceFlinger crea la capa y la envía a WindowManager. Luego, WindowManager envía la superficie a la app, pero mantiene el SurfaceControl para manipular el aspecto de la app en la pantalla.

En Android 10, se agrega ASurfaceControl, que es otra forma en que SurfaceFlinger puede aceptar búferes. ASurfaceControl combina una superficie y un SurfaceControl en un paquete de transacción que se envía a SurfaceFlinger. Un ASurfaceControl está asociado con una capa, que las apps actualizan a través de ASurfaceTransactions. Luego, las apps obtienen información sobre ASurfaceTransactions a través de devoluciones de llamada que pasan ASurfaceTransactionStats que contiene información, como el tiempo de bloqueo, los tiempos de adquisición, etcétera.

En la siguiente tabla, se incluyen más detalles sobre ASurfaceControl y sus componentes asociados.

Componente Descripción
ASurfaceControl Une SurfaceControl y permite que una app cree SurfaceControls que corresponden a capas en la pantalla.

Se puede crear como elemento secundario de ANativeWindow o como elemento secundario de otro ASurfaceControl.
ASurfaceTransaction Une la transacción para permitir que el cliente edite las propiedades descriptivas de una capa, como la geometría, y envía los búferes actualizados a SurfaceFlinger.
ASurfaceTransactionStats Envía información sobre las transacciones que se presentaron, como el tiempo de bloqueo, los tiempos de adquisición y la cerca de lanzamiento anterior, a una app a través de una devolución de llamada registrada previamente.

Si bien las apps pueden enviar búferes en cualquier momento, SurfaceFlinger solo se activa para aceptar búferes entre actualizaciones de pantalla, que pueden variar según el dispositivo. Esto minimiza el uso de memoria y evita que se produzcan seccionamientos visibles en la pantalla, lo que puede ocurrir cuando se actualiza la pantalla durante la actualización.

Cuando la pantalla está entre actualizaciones, envía la señal VSYNC a SurfaceFlinger. La señal de VSYNC indica que la pantalla se puede actualizar sin seccionamientos. Cuando SurfaceFlinger recibe la señal de VSYNC, revisa su lista de capas en busca de búferes nuevos. Si SurfaceFlinger encuentra un búfer nuevo, lo adquiere. De lo contrario, continúa usando el búfer adquirido anteriormente. SurfaceFlinger siempre debe mostrar algo, por lo que se cuelga de un búfer. Si nunca se enviaron búferes a una capa, esta se ignora.

Después de que SurfaceFlinger recopile todos los búferes para las capas visibles, le pregunta al compositor de hardware (HWC) cómo se debe realizar la composición. Si HWC marca el tipo de composición de capa como composición de cliente, SurfaceFlinger compone esas capas. Luego, SurfaceFlinger pasa el búfer de salida al HWC.

WindowManager

WindowManager controla los objetos window, que son contenedores de objetos view. Los objetos de ventana siempre están respaldados por objetos de superficie. WindowManager supervisa los ciclos de vida, los eventos de entrada y enfoque, la orientación de la pantalla, las transiciones, las animaciones, la posición, las transformaciones, el orden en Z y muchos otros aspectos de una ventana. WindowManager envía todos los metadatos de la ventana a SurfaceFlinger para que SurfaceFlinger pueda usar esos datos para componer superficies en la pantalla.

Rotación previa

Muchas superposiciones de hardware no admiten la rotación (y, aunque lo hagan, cuesta potencia de procesamiento). La solución es transformar el búfer antes de que llegue a SurfaceFlinger. Android admite una sugerencia de consulta (NATIVE_WINDOW_TRANSFORM_HINT) en ANativeWindow para representar la transformación más probable que SurfaceFlinger aplicará al búfer. Los controladores de GL pueden usar esta sugerencia para transformar previamente el búfer antes de que llegue a SurfaceFlinger, de modo que, cuando llegue el búfer, se transforme de forma correcta.

Por ejemplo, cuando recibas una sugerencia para rotar 90 grados, genera y aplica una matriz al búfer para evitar que se ejecute al final de la página. Para ahorrar energía, haz esta rotación previa. Para obtener más información, consulta la interfaz ANativeWindow definida en system/core/include/system/window.h.