O que todo desenvolvedor deve saber sobre superfícies, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger e Vulkan.
Esta página descreve 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 o SurfaceView e o TextureView se comportam dessa maneira ou como as superfícies e o EGLSurface interagem, você está no lugar correto.
Presume-se alguma familiaridade com dispositivos Android e desenvolvimento de aplicativos. Você não precisa de conhecimento detalhado da estrutura do aplicativo e poucas chamadas de API são mencionadas, mas o material não se sobrepõe a outra documentação pública. O objetivo é fornecer detalhes sobre os eventos significativos envolvidos na renderização de um quadro para saída, para ajudar você a fazer escolhas informadas ao projetar um aplicativo. Para conseguir isso, trabalhamos de baixo para cima, descrevendo como as classes de UI funcionam, e não como elas podem ser usadas.
Esta seção inclui várias páginas que cobrem tudo, desde material de base 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, em seguida, prossegue para os mecanismos de nível superior que fornecem dados ao compositor. Recomendamos a leitura das 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 realizadas por meio do alocador de memória gralloc implementado por meio de uma interface HAL específica do fornecedor.
- SurfaceFlinger, Hardware Composer e monitores virtuais . SurfaceFlinger aceita buffers de dados de múltiplas fontes, os compõe e os envia para o display. O Hardware Composer HAL (HWC) determina a maneira mais eficiente de compor buffers com o hardware disponível, e os monitores 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 Canvas fornecem uma implementação de software (com suporte de aceleração de hardware) para desenhar diretamente em uma superfície (alternativa de baixo nível ao OpenGL ES). Qualquer coisa relacionada a 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 gráfica 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 aborda ANativeWindow, o equivalente em C/C++ da classe Java Surface usada para criar uma superfície de janela EGL a partir de código nativo.
- Vulcano . Vulkan é uma API de plataforma cruzada e 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 visualizaçã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 é obrigatório para usar GLES).
- Textura da superfície . SurfaceTexture combina uma superfície e uma textura GLES para criar um BufferQueue do 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 ao GLES como uma textura externa. O Android 7.0 adicionou suporte para reprodução segura de vídeo de textura, permitindo o pós-processamento de conteúdo de vídeo protegido por GPU.
- TexturaView . TextureView combina uma visualização com um SurfaceTexture. TextureView envolve um SurfaceTexture e assume a responsabilidade de responder a retornos de chamada e adquirir novos buffers. Ao desenhar, o TextureView usa o conteúdo do buffer recebido mais recentemente como fonte de dados, renderizando onde e como o estado da visualização indicar que deveria. A composição da visualização é sempre realizada com GLES, o que significa que atualizações no conteúdo podem fazer com que outros elementos da visualização também sejam redesenhados.