SurfaceFlinger acepta búferes, los compone y los envía a la pantalla. WindowManager proporciona a SurfaceFlinger buffers y metadatos de ventana, que SurfaceFlinger utiliza para componer superficies en la pantalla.
SuperficieFlinger
SurfaceFlinger puede aceptar buffers de dos maneras: a través de BufferQueue y SurfaceControl, o mediante ASuperfaceControl.
Una forma en que SurfaceFlinger acepta buffers es a través de BufferQueue y SurfaceControl. Cuando una aplicación pasa a primer plano, solicita buffers 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. Luego, WindowManager 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 buffers. ASuperfaceControl combina una superficie y un SurfaceControl en un paquete de transacciones que se envía a SurfaceFlinger. Un ASurfaceControl está asociado con una capa, cuyas aplicaciones actualizan a través de ASurfaceTransactions. Luego, las aplicaciones obtienen información sobre ASurfaceTransactions a través de devoluciones de llamadas que pasan por ASurfaceTransactionStats que contiene información, como el tiempo de retención, los tiempos de adquisición, etc.
La siguiente tabla incluye más detalles sobre ASuperfaceControl y sus componentes asociados.
Componente | Descripción |
---|---|
Control de superficie | 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. |
Una transacción de superficie | Envuelve 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. |
Estadísticas de transacciones de superficie | 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 liberación anterior, a una aplicación a través de una devolución de llamada prerregistrada. |
Aunque las aplicaciones 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 roturas visibles en la pantalla, que pueden ocurrir al actualizar la pantalla en 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 la pantalla se puede actualizar sin interrumpirse. Cuando SurfaceFlinger recibe la señal VSYNC, SurfaceFlinger recorre su lista de capas en busca de nuevos buffers. Si SurfaceFlinger encuentra un nuevo búfer, SurfaceFlinger adquiere el búfer; de lo contrario, SurfaceFlinger continúa usando el búfer adquirido previamente. SurfaceFlinger siempre debe mostrar algo, por lo que se aferra a un búfer. Si nunca se han enviado buffers en una capa, la capa se ignora.
Después de que SurfaceFlinger haya recopilado todos los buffers para las capas visibles, le pregunta al Hardware Composer (HWC) cómo se 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 .
Administrador de ventanas
WindowManager controla los objetos de ventana , que son contenedores para objetos de vista . 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.
Pre-rotación
Muchas superposiciones de hardware no admiten la rotación (e incluso si lo hicieran, 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 reciba una sugerencia para rotar 90 grados, genere y aplique una matriz al búfer para evitar que se salga del final de la página. Para ahorrar energía, haga esta rotación previa. Para obtener más información, consulte la interfaz ANativeWindow
definida en system/core/include/system/window.h
.