SurfaceFlinger aceita buffers, compõe buffers e envia buffers para o display. WindowManager fornece ao SurfaceFlinger buffers e metadados de janela, que o SurfaceFlinger usa para compor superfícies na exibição.
SurfaceFlinger
SurfaceFlinger pode aceitar buffers de duas maneiras: por meio de BufferQueue e SurfaceControl ou por meio de ASurfaceControl.
Uma maneira pela qual o SurfaceFlinger aceita buffers é por meio de BufferQueue e SurfaceControl. Quando um aplicativo chega ao primeiro plano, ele solicita buffers do WindowManager . O WindowManager então solicita uma camada do SurfaceFlinger. Uma camada é uma combinação de um surface , que contém o BufferQueue, e um SurfaceControl , que contém os metadados da camada, como o quadro de exibição. SurfaceFlinger cria a camada e a envia para WindowManager. WindowManager então envia a superfície para o aplicativo, mas mantém o SurfaceControl para manipular a aparência do aplicativo na tela.
O Android 10 adiciona ASurfaceControl, que é outra maneira pela qual o SurfaceFlinger pode aceitar buffers. ASuperfaceControl combina uma superfície e um SurfaceControl em um pacote de transação que é enviado ao SurfaceFlinger. Um ASurfaceControl está associado a uma camada, que os aplicativos atualizam por meio de ASurfaceTransactions. Os aplicativos então obtêm informações sobre ASurfaceTransactions por meio de retornos de chamada que passam ASurfaceTransactionStats contendo informações, como tempo de travamento, tempos de aquisição e assim por diante.
A tabela a seguir inclui mais detalhes sobre ASuperfaceControl e seus componentes associados.
Componente | Descrição |
---|---|
ASuperfícieControl | Envolve SurfaceControl e permite que um aplicativo crie SurfaceControls que correspondem a camadas na exibição. Pode ser criado como filho de ANativeWindow ou como filho de outro ASurfaceControl. |
ASurfaceTransaction | Quebra a transação para permitir que o cliente edite as propriedades descritivas de uma camada, como geometria, e envie os buffers atualizados para o SurfaceFlinger. |
ASurfaceTransactionStats | Envia informações sobre transações que foram apresentadas, como tempo de travamento, tempos de aquisição e limite de liberação anterior, para um aplicativo por meio de um retorno de chamada pré-registrado. |
Embora os aplicativos possam enviar buffers a qualquer momento, o SurfaceFlinger só ativa para aceitar buffers entre as atualizações de exibição, que podem variar dependendo do dispositivo. Isso minimiza o uso de memória e evita rasgos visíveis na tela, que podem ocorrer ao atualizar a tela no meio da atualização.
Quando a tela está entre as atualizações, ela envia o sinal VSYNC para o SurfaceFlinger. O sinal VSYNC indica que a tela pode ser atualizada sem rasgar. Quando o SurfaceFlinger recebe o sinal VSYNC, o SurfaceFlinger percorre sua lista de camadas em busca de novos buffers. Se o SurfaceFlinger encontrar um novo buffer, o SurfaceFlinger adquirirá o buffer; caso contrário, o SurfaceFlinger continuará a usar o buffer adquirido anteriormente. SurfaceFlinger deve sempre exibir algo, então ele fica preso em um buffer. Se nenhum buffer tiver sido enviado em uma camada, a camada será ignorada.
Após o SurfaceFlinger coletar todos os buffers das camadas visíveis, ele pergunta ao Hardware Composer (HWC) como a composição deve ser executada. Se o HWC marcar o tipo de composição de camada como composição do cliente, o SurfaceFlinger compõe essas camadas. Em seguida, SurfaceFlinger passa o buffer de saída para o HWC .
Gerenciador de janelas
WindowManager controla objetos de janela , que são contêineres para objetos de visualização . Objetos de janela são sempre apoiados por objetos de superfície. WindowManager supervisiona ciclos de vida, eventos de entrada e foco, orientação de tela, transições, animações, posição, transformações, ordem z e muitos outros aspectos de uma janela. WindowManager envia todos os metadados da janela para o SurfaceFlinger para que o SurfaceFlinger possa usar esses dados para compor superfícies na tela.
Pré-rotação
Muitas sobreposições de hardware não suportam rotação (e mesmo que suportem, isso custa poder de processamento); a solução é transformar o buffer antes que ele chegue ao SurfaceFlinger. O Android oferece suporte a uma dica de consulta ( NATIVE_WINDOW_TRANSFORM_HINT
) em ANativeWindow
para representar a transformação mais provável a ser aplicada ao buffer pelo SurfaceFlinger. Os drivers GL podem usar essa dica para pré-transformar o buffer antes que ele chegue ao SurfaceFlinger para que, quando o buffer chegar, ele seja transformado corretamente.
Por exemplo, ao receber uma dica para girar 90 graus, gere e aplique uma matriz ao buffer para evitar que ele saia do final da página. Para economizar energia, faça esta pré-rotação. Para obter detalhes, consulte a interface ANativeWindow
definida em system/core/include/system/window.h
.