Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

SurfaceFlinger y WindowManager

SurfaceFlinger acepta búferes, compone búferes y envía búferes a la pantalla. WindowManager proporciona SurfaceFlinger con búferes y metadatos de ventana, que SurfaceFlinger usa para componer superficies en la pantalla.

SurfaceFlinger

SurfaceFlinger puede aceptar búferes de dos formas: mediante BufferQueue y SurfaceControl, o mediante ASurfaceControl.

Una forma en que SurfaceFlinger acepta búferes es a través de BufferQueue y SurfaceControl. Cuando una aplicación pasa a primer plano, solicita búferes de WindowManager . WindowManager luego solicita una capa de SurfaceFlinger. Una capa es una combinación de una superficie , que contiene 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. WindowManager luego envía la superficie a la aplicación, pero mantiene SurfaceControl para manipular la apariencia de la aplicación en la pantalla.

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

La siguiente tabla incluye más detalles sobre ASurfaceControl y sus componentes asociados.

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

Se puede crear como hijo de ANativeWindow o como hijo de otro ASurfaceControl.
ASurfaceTransaction Wraps 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 han presentado, como el tiempo de cierre, los tiempos de adquisición y el límite de lanzamiento anterior, a una aplicación a través de una devolución de llamada registrada previamente.

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

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

Una vez que SurfaceFlinger ha recopilado todos los búferes para las capas visibles, le pregunta al Compositor de hardware (HWC) cómo se debe realizar la composición. Si la 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 de la ventana , que son contenedores para los objetos de visualización . 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 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.

Prerrotación

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 pre-transformar el búfer antes de que llegue a SurfaceFlinger para que cuando llegue el búfer, se transforme correctamente.

Por ejemplo, cuando reciba una sugerencia para rotar 90 grados, genere y aplique una matriz al búfer para evitar que se agote al final de la página. Para ahorrar energía, haga esta rotación previa. Para obtener más detalles, consulte la interfaz ANativeWindow definida en system/core/include/system/window.h .