Arquitetura gráfica

O que todo desenvolvedor deve saber sobre superfícies, SurfaceHolder, EGLsurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger e Vulkan.

Esta página descreve os elementos essenciais da arquitetura gráfica no nível do sistema Android e como eles são usados ​​pela estrutura do aplicativo e pelo sistema multimídia. O foco está em como os buffers de dados gráficos se movem pelo sistema. Se você já se perguntou por que SurfaceView e TextureView se comportam da maneira como se comportam, ou como superfícies e EGLsurface interagem, você está no lugar certo.

Presume-se alguma familiaridade com dispositivos Android e desenvolvimento de aplicativos. Você não precisa de conhecimento detalhado da estrutura do aplicativo e muito poucas chamadas de API são mencionadas, mas o material não se sobrepõe a outras documentações públicas. O objetivo é fornecer detalhes sobre os eventos significativos envolvidos na renderização de um quadro para saída para ajudá-lo a fazer escolhas informadas ao projetar um aplicativo. Para conseguir isso, trabalhamos de baixo para cima, descrevendo como as classes de interface do usuário funcionam e não como elas podem ser usadas.

Esta seção inclui várias páginas que cobrem tudo, desde material de fundo até detalhes de HAL e casos de uso. Ele começa com uma explicação dos buffers gráficos do Android, descreve a composição e o mecanismo de exibição e prossegue para os mecanismos de nível superior que fornecem dados ao compositor. Recomendamos ler as páginas na ordem listada abaixo em vez de pular para um tópico que pareça interessante.

Componentes de baixo nível

  • BufferQueue e gralloc . BufferQueue conecta algo que gera buffers de dados gráficos (o produtor ) a algo que aceita os dados para exibição ou processamento posterior (o consumidor ). As alocações de buffer são executadas por meio do alocador de memória gralloc implementado por meio de uma interface HAL específica do fornecedor.
  • SurfaceFlinger, Compositor de Hardware e monitores virtuais . O SurfaceFlinger aceita buffers de dados de várias fontes, os compõe e os envia para o monitor. O Hardware Composer HAL (HWC) determina a maneira mais eficiente de compor buffers com o hardware disponível, e os displays virtuais disponibilizam a saída composta dentro do sistema (gravando a tela ou enviando a tela por uma rede).
  • Superfície, tela e SurfaceHolder . Uma superfície produz uma fila de buffer que geralmente é consumida pelo SurfaceFlinger. Ao renderizar em uma superfície, o resultado acaba em um buffer que é enviado ao consumidor. As APIs do Canvas fornecem uma implementação de software (com suporte para aceleração de hardware) para desenhar diretamente em uma superfície (alternativa de baixo nível ao OpenGL ES). Qualquer coisa que tenha a ver com uma visualização envolve um SurfaceHolder, cujas APIs permitem obter e definir parâmetros de superfície, como tamanho e formato.
  • EGLSurface e OpenGL ES . OpenGL ES (GLES) define uma API de renderização de gráficos projetada para ser combinada com EGL , uma biblioteca que pode criar e acessar janelas através do sistema operacional (para desenhar polígonos texturizados, use chamadas GLES; para colocar renderização na tela, use chamadas EGL ). Esta página também abrange ANativeWindow, o equivalente C/C++ da classe Java Surface usada para criar uma superfície de janela EGL a partir de código nativo.
  • Vulkan . Vulkan é uma API multiplataforma de baixa sobrecarga para gráficos 3D de alto desempenho. Assim como o OpenGL ES, o Vulkan fornece ferramentas para criar gráficos de alta qualidade em tempo real em aplicativos. As vantagens do Vulkan incluem reduções na sobrecarga da CPU e suporte para a linguagem SPIR-V Binary Intermediate .

Componentes de alto nível

  • SurfaceView e GLSurfaceView . SurfaceView combina uma superfície e uma vista. Os componentes de exibição do SurfaceView são compostos pelo SurfaceFlinger (e não pelo aplicativo), permitindo a renderização de um thread/processo separado e o isolamento da renderização da interface do usuário do aplicativo. GLSurfaceView fornece classes auxiliares para gerenciar contextos EGL, comunicação entre threads e interação com o ciclo de vida da atividade (mas não é necessário usar GLES).
  • Textura de Superfície . SurfaceTexture combina uma textura de superfície e GLES para criar um BufferQueue para o qual seu aplicativo é o consumidor. Quando um produtor enfileira um novo buffer, ele notifica seu aplicativo, que por sua vez libera o buffer retido anteriormente, adquire o novo buffer da fila e faz chamadas EGL para disponibilizar o buffer para GLES como uma textura externa. O Android 7.0 adicionou suporte para reprodução de vídeo de textura segura, permitindo o pós-processamento da GPU de conteúdo de vídeo protegido.
  • TextureView . TextureView combina uma vista com uma SurfaceTexture. TextureView envolve um SurfaceTexture e assume a responsabilidade de responder a retornos de chamada e adquirir novos buffers. Ao desenhar, TextureView usa o conteúdo do buffer recebido mais recentemente como sua fonte de dados, renderizando onde e como o estado de exibição indicar. A composição da vista é sempre realizada com GLES, o que significa que as atualizações no conteúdo podem fazer com que outros elementos da vista sejam redesenhados também.