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 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 a WindowManager
. Luego, WindowManager
solicita una capa a SurfaceFlinger. Una capa es una combinación de una superficie, que contiene el BufferQueue, y una instancia de SurfaceControl
, que contiene los metadatos de la capa, como el fotograma de visualización.
SurfaceFlinger crea la capa y la envía a WindowManager
. WindowManager
y, luego, envía la superficie a la app, pero mantiene la instancia de SurfaceControl
para manipular la apariencia de la app en la pantalla.
Android 10 agrega ASurfaceControl
, que es otra forma en que SurfaceFlinger puede aceptar búferes. ASurfaceControl
combina una superficie y una instancia de SurfaceControl
en un paquete de transacción que se envía a SurfaceFlinger. ASurfaceControl
se asocia con una capa, que las apps actualizan a través de instancias de ASurfaceTransaction
. Luego, las apps obtienen información sobre las instancias de ASurfaceTransaction
a través de devoluciones de llamadas que pasan ASurfaceTransactionStats
con 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 |
Encapsula SurfaceControl y permite que una app cree instancias de SurfaceControl que corresponden a capas en la pantalla.Se puede crear como elemento secundario de ANativeWindow o 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 la hora de bloqueo, los tiempos de adquisición y la barrera de liberación anterior, a una app a través de una devolución de llamada preregistrada. |
Si bien las apps pueden enviar búferes en cualquier momento, SurfaceFlinger solo se activa para aceptar búferes entre las actualizaciones de la pantalla, lo que puede variar 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 el signo VSync a SurfaceFlinger. La señal de VSync indica que la pantalla se puede actualizar sin interrupciones. Cuando SurfaceFlinger recibe el indicador VSync, recorre su lista de capas en busca de búferes nuevos. Si SurfaceFlinger encuentra un búfer nuevo, lo adquiere; de lo contrario, sigue usando el búfer adquirido anteriormente. SurfaceFlinger siempre debe mostrar algo, por lo que se aferra a un búfer. Si nunca se enviaron búferes en una capa, se ignora la capa.
Después de que SurfaceFlinger recopila todos los búferes 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 capas 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 los objetos View
. Los objetos Window
siempre están respaldados por objetos Surface
.
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 este 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, consumen 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 correctamente.
Por ejemplo, cuando recibes 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 esto antes de la rotación. Para obtener más información, consulta la interfaz ANativeWindow
definida en system/core/include/system/window.h
.