SurfaceFlinger y WindowManager

SurfaceFlinger acepta, compone y envía búferes a la pantalla. WindowManager proporciona a SurfaceFlinger búferes y metadatos de ventanas, que SurfaceFlinger usa para componer 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 de WindowManager. Luego, WindowManager solicita una capa de SurfaceFlinger. Una capa es una combinación de una superficie, que contiene BufferQueue, y una instancia de SurfaceControl, que contiene los metadatos de la capa, como el marco de la pantalla. SurfaceFlinger crea la capa y la envía a WindowManager. WindowManager envía la superficie a la app, pero conserva la instancia de SurfaceControl para manipular la apariencia de la app en la pantalla.

A partir de Android 10, ASurfaceControl proporciona otra forma para que SurfaceFlinger acepte búferes. ASurfaceControl combina una superficie y una instancia de SurfaceControl en un paquete de transacción que recibe SurfaceFlinger. ASurfaceControl está asociado con una capa que las apps actualizan a través de instancias de ASurfaceTransaction. Luego, las apps obtienen información sobre ASurfaceTransaction instancias a través de devoluciones de llamada que pasan ASurfaceTransactionStats que contiene información, como el tiempo de bloqueo y los tiempos de adquisición.

En la siguiente tabla, se describen ASurfaceControl y sus componentes asociados:

Componente Descripción
ASurfaceControl Encapsula SurfaceControl y permite que una app cree instancias de SurfaceControl que corresponden a capas en la pantalla.
Se puede crear como un elemento secundario de ANativeWindow o como un elemento secundario de otra instancia de ASurfaceControl.
ASurfaceTransaction Encapsula Transaction 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 valla de liberación anterior, a una app a través de una devolución de llamada preregistrada.

Aunque las apps pueden enviar búferes en cualquier momento, SurfaceFlinger solo se activa para aceptar búferes entre las actualizaciones de la pantalla, que pueden diferir según el dispositivo. Esto minimiza el uso de memoria y evita el desgarro visible en la pantalla, que puede ocurrir cuando se actualiza la pantalla a mitad de la actualización.

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

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

WindowManager

WindowManager controla los objetos Window, que son contenedores para objetos View. Los objetos Window siempre están respaldados por Surface objetos. 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 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 (e incluso si lo hacen, 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 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 correctamente.

Por ejemplo, cuando recibas una sugerencia para rotar 90 grados, genera y aplica una matriz al búfer para evitar que se salga del 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.