SurfaceFlinger aceita buffers, compõe buffers e envia buffers para a tela. O WindowManager fornece ao SurfaceFlinger buffers e metadados de janela, que o SurfaceFlinger usa para compor superfícies para a exibição.
SurfaceFlinger
O SurfaceFlinger pode aceitar buffers de duas maneiras: por meio de BufferQueue e SurfaceControl ou por meio de ASurfaceControl.
Uma maneira que o SurfaceFlinger aceita buffers é por meio de BufferQueue e SurfaceControl. Quando um aplicativo chega ao primeiro plano, ele solicita buffers de WindowManager . WindowManager então solicita uma camada do SurfaceFlinger. Uma camada é uma combinação de uma superfície , 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 o 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 de o SurfaceFlinger aceitar buffers. ASurfaceControl combina uma superfície e um SurfaceControl em um pacote de transação que é enviado para SurfaceFlinger. Um ASurfaceControl está associado a uma camada, que os aplicativos atualizam por meio de ASurfaceTransactions. Os aplicativos 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 ASurfaceControl e seus componentes associados.
Componente | Descrição |
---|---|
ASuperfícieControl | Envolve o SurfaceControl e permite que um aplicativo crie SurfaceControls que correspondem às camadas na tela. Pode ser criado como filho de ANativeWindow ou como filho de outro ASurfaceControl. |
ASuperfícieTransação | Envolve a transação para permitir que o cliente edite as propriedades descritivas de uma camada, como geometria, e envie os buffers atualizados para 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ó acorda para aceitar buffers entre as atualizações de exibição, que podem diferir 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 atualizações, a tela 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 procurando por novos buffers. Se o SurfaceFlinger encontrar um novo buffer, o SurfaceFlinger adquirirá o buffer; se não, SurfaceFlinger continua a usar o buffer adquirido anteriormente. O SurfaceFlinger deve sempre exibir algo, então ele fica preso a um buffer. Se nenhum buffer tiver sido enviado em uma camada, a camada será ignorada.
Após o SurfaceFlinger ter coletado todos os buffers para camadas visíveis, ele pergunta ao Hardware Composer (HWC) como a composição deve ser executada. Se o HWC marca o tipo de composição da camada como composição do cliente, o SurfaceFlinger compõe essas camadas. Em seguida, o SurfaceFlinger passa o buffer de saída para o HWC .
Gerenciador de Janelas
WindowManager controla os 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. O 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 se suportam, isso custa poder de processamento); a solução é transformar o buffer antes que ele atinja o SurfaceFlinger. O Android dá 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 atinja o 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
.