El framework de Android ofrece una variedad de APIs de procesamiento de gráficos para 2D y 3D que interactúan con las implementaciones del fabricante de controladores de gráficos, por lo que es importante comprender bien cómo funcionan esas APIs en un nivel superior. En esta página, se presenta la capa de abstracción de hardware (HAL) de gráficos en la que se basan esos controladores. Antes de continuar con esta sección, familiarízate con los siguientes términos:
Canvas (elemento de la API)Surface. La clase Canvas tiene métodos para el dibujo estándar por computadora de mapas de bits, líneas, círculos, rectángulos, texto, etc., y está vinculada a un mapa de bits o una superficie. El lienzo es la manera más sencilla de dibujar objetos en 2D en la pantalla. La clase base es Canvas.
android.graphics.drawable.
Para obtener más información sobre los elementos de diseño y otros recursos, consulta
Descripción general de los recursos de las apps.
android.opengl
y javax.microedition.khronos.opengles
exponen la funcionalidad de OpenGL ES.Surface (elemento de la API)Surface. Usa la
SurfaceView
clase en lugar de la
Surface clase directamente.
SurfaceView (elemento de la API)View que une un objeto
Surface para dibujar y expone métodos que permiten especificar su tamaño y su formato
dinámicamente. Una vista de superficie proporciona una forma de dibujar independientemente del subproceso de la IU
para operaciones que requieren un uso intensivo de los recursos (como juegos o vistas previas de cámara), pero, como resultado, utiliza memoria adicional. Una vista de superficie admite gráficos de lienzo y OpenGL ES
gráficos. La clase base para un SurfaceView objeto es
SurfaceView.
R.style
y comienzan con Theme_.View (elemento de la API)View es la clase base
para la mayoría de los componentes de diseño de una pantalla de actividad o diálogo, como cuadros de texto
y ventanas. Un objeto View recibe llamadas de su objeto superior (consulta
ViewGroup) para dibujarse e informa al objeto superior
sobre su tamaño y ubicación preferidos, que el superior podría no respetar. Para obtener más información, consulta
View.
ViewGroup (elemento de la API)android.widget
paquete, pero extienden la
ViewGroup
clase.
android.widget
paquete. Window (elemento de la API)Window
clase abstracta que especifica los elementos de una ventana genérica, como el aspecto, el texto de la barra de título, la ubicación y el contenido de los
menús. Los diálogos y las actividades utilizan una implementación de la
Window clase para renderizar un Window objeto. No necesitas implementar
la clase Window ni usar ventanas en tu app.Los desarrolladores de apps dibujan imágenes en la pantalla de tres maneras: con Canvas, OpenGL ES o Vulkan.
Componentes gráficos de Android
Sin importar qué API de renderización usen los desarrolladores, todo se renderiza en una superficie. La superficie representa el lado del productor de una cola de búferes que suele consumir SurfaceFlinger. Cada ventana que se crea en la plataforma de Android está respaldada por una superficie. SurfaceFlinger compone todas las superficies visibles renderizadas en la pantalla.
En el siguiente diagrama, se muestra cómo funcionan juntos los componentes clave:

Figura 1: Cómo se renderizan las superficies
Los componentes principales se describen en las siguientes secciones.
Productores de transmisión de imágenes
Un productor de transmisión de imágenes puede ser cualquier elemento que produzca búferes gráficos para el consumo. Entre los ejemplos, se incluyen OpenGL ES, Canvas 2D y decodificadores de video de mediaserver.
Consumidores de transmisión de imágenes
El consumidor más común de transmisiones de imágenes es SurfaceFlinger, el servicio del sistema que consume las superficies visibles actualmente y las compone en la pantalla con la información proporcionada por el administrador de ventanas. SurfaceFlinger es el único servicio que puede modificar el contenido de la pantalla. SurfaceFlinger usa OpenGL y Hardware Composer (HWC) para componer un grupo de superficies.
Otras apps de OpenGL ES también pueden consumir transmisiones de imágenes, como la app de la cámara que consume una transmisión de imágenes de vista previa de la cámara. Las apps que no son de GL también pueden ser consumidores, por ejemplo, la clase ImageReader.
Hardware Composer
La abstracción de hardware para el subsistema de visualización. SurfaceFlinger puede delegar cierto trabajo de composición en el HWC para descargar trabajo de OpenGL y la GPU. SurfaceFlinger actúa como otro cliente de OpenGL ES. Por lo tanto, cuando SurfaceFlinger compone de forma activa uno o dos búferes en un tercero, por ejemplo, usa OpenGL ES. Esto hace que la composición sea de menor potencia que si la GPU realizara todos los cálculos.
La HAL de Hardware Composer realiza la otra mitad del trabajo y es el punto central para toda la renderización de gráficos de Android. El HWC debe admitir eventos, uno de los cuales es VSync (otro es la conexión en caliente para la compatibilidad con HDMI plug-and-play).
Gralloc
Se necesita el asignador de memoria de gráficos (Gralloc) para asignar la memoria solicitada por los productores de imágenes. Para obtener más información, consulta BufferQueue y Gralloc.
Flujo de datos
En el siguiente diagrama, se muestra la canalización de gráficos de Android:

Figura 2: Flujo de datos gráficos a través de Android
Los objetos de la izquierda son renderizadores que producen búferes gráficos, como la pantalla principal, la barra de estado y la IU del sistema. SurfaceFlinger es el compositor y el HWC es el compositor.
BufferQueue
BufferQueues proporciona la unión entre los componentes gráficos de Android. Se trata de un par de colas que median el ciclo constante de búferes del productor al consumidor. Después de que los productores entregan sus búferes, SurfaceFlinger es responsable de componer todo en la pantalla.
En el siguiente diagrama, se ilustra el proceso de comunicación de BufferQueue:

Figura 3: Proceso de comunicación de BufferQueue
BufferQueue contiene la lógica que une a los productores y consumidores de transmisión de imágenes. Algunos ejemplos de productores de imágenes son las vistas previas de la cámara producidas por la HAL de la cámara o los juegos de OpenGL ES. Algunos ejemplos de consumidores de imágenes son SurfaceFlinger u otra app que muestra una transmisión de OpenGL ES, como la app de la cámara que muestra el visor de la cámara.
BufferQueue es una estructura de datos que combina un grupo de búferes con una cola y usa la comunicación entre procesos (IPC) de Binder para pasar búferes entre procesos. La interfaz del productor, o
lo que le pasas a alguien que quiere generar búferes gráficos, es
IGraphicBufferProducer (parte de SurfaceTexture).
BufferQueue se usa con frecuencia para renderizar en una superficie y consumir con un consumidor de GL, entre otras tareas.
BufferQueue puede funcionar de tres formas diferentes:
Para realizar la mayor parte de este trabajo, SurfaceFlinger actúa como otro cliente de OpenGL ES. Por lo tanto, cuando SurfaceFlinger compone de forma activa uno o dos búferes en un tercero, por ejemplo, usa OpenGL ES.
La HAL de Hardware Composer realiza la otra mitad del trabajo. Esta HAL actúa como el punto central para toda la renderización de gráficos de Android.