SurfaceFlinger e WindowManager

O SurfaceFlinger aceita, compõe e envia buffers para o exibição. A WindowManager fornece ao SurfaceFlinger buffers e janelas metadados, que o SurfaceFlinger usa para compor superfícies na tela.

SurfaceFlinger

O SurfaceFlinger pode aceitar buffers de duas maneiras: por BufferQueue e SurfaceControl ou por ASurfaceControl.

Uma maneira de o SurfaceFlinger aceitar buffers é por meio de BufferQueue e SurfaceControl. Quando um aplicativo vem para o primeiro plano, ele solicita buffers de WindowManager. A WindowManager solicita uma camada com o SurfaceFlinger. Uma camada é uma combinação de uma superfície, que contém a BufferQueue, e um SurfaceControl, que contém os metadados da camada, como o frame de exibição. O SurfaceFlinger cria a camada e a envia para o WindowManager. O WindowManager envia a superfície para o app, mas mantém o SurfaceControl para manipular a aparência do app na tela.

O Android 10 adiciona o ASurfaceControl, que é outra de modo que o SurfaceFlinger possa aceitar buffers. ASurfaceControl combina uma superfície e um SurfaceControl em um pacote de transação enviado ao com o SurfaceFlinger. Um ASurfaceControl é associado a uma camada, quais apps atualizados por meio de ASurfaceTransactions. Em seguida, os apps recebem informações sobre ASurfaceTransactions por meio de callbacks que transmitem ASurfaceTransactionStats com informações, como tempo de trava, tempos de aquisição e assim por diante.

A tabela a seguir inclui mais detalhes sobre o ASurfaceControl e seus componentes associados.

Componente Descrição
ASurfaceControl Envolve o SurfaceControl e permite que um app crie SurfaceControls que correspondem a camadas na tela.

Pode ser criado como um filho de ANativeWindow ou como um filho de outro ASurfaceControl.
Transação ASurface Encapsula transação para permitir que o cliente edite a descrição descritiva de uma camada propriedades, como geometria, e envia os buffers atualizados para com o SurfaceFlinger.
ASurfaceTransactionStats Envia informações sobre as transações que foram apresentadas, como tempo de trava, tempos de aquisição e limite de lançamento anterior a um app por meio de uma callback pré-registrado.

Embora os aplicativos possam enviar buffers a qualquer momento, o SurfaceFlinger só é ativado para aceitam buffers entre as atualizações da tela, que podem diferir dependendo da dispositivo. Isso minimiza o uso de memória e evita a fragmentação visível na tela, que pode ocorrer ao atualizar a tela durante a atualização.

Quando a tela está entre as atualizações, ela envia o erro VSYNC para o SurfaceFlinger. O sinal VSYNC indica que o visor pode ser atualizado sem rasgar. Quando o SurfaceFlinger recebe o sinal VSYNC, ele procura na lista de camadas em busca de novos buffers. Se o SurfaceFlinger encontrar um novo buffer, o SurfaceFlinger adquire o buffer; caso contrário, o SurfaceFlinger continua para usar o buffer adquirido anteriormente. O SurfaceFlinger sempre deve exibir algo, então ele fica armazenado em um buffer. Se nenhuma reserva tiver sido enviada em um a camada será ignorada.

Depois que o SurfaceFlinger tiver coletado todos os buffers para as camadas visíveis, ele solicitará no Hardware Composer (HWC) de como a composição deve ser realizada. Se o dispositivo HWC marca o tipo de composição da camada como composição do cliente, o SurfaceFlinger compõe essas camadas. Em seguida, o SurfaceFlinger transmite o buffer de saída para o HWC.

WindowManager

O WindowManager controla objetos janela, que são contêineres de objetos visualização. Os objetos Window são sempre respaldados pelo objetos na superfície. O WindowManager supervisiona ciclos de vida, eventos de entrada e foco, orientação da 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, que pode 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 sim, isso custa capacidade de processamento) a solução é transformar o buffer antes que ele alcance com o SurfaceFlinger. O Android oferece suporte a uma dica de consulta (NATIVE_WINDOW_TRANSFORM_HINT) em ANativeWindow a representam a transformação mais provável a ser aplicada ao buffer com o SurfaceFlinger. Os drivers GL podem usar essa dica para pré-transformar o buffer até alcançar o SurfaceFlinger. Assim, quando o buffer chegar, ele será transformados.

Por exemplo, ao receber uma dica para girar 90 graus, gere e aplique uma para o buffer para evitar que ela seja executada no fim da página. Para salvar fazer essa pré-rotação. Para mais detalhes, consulte a ANativeWindow interface definida em system/core/include/system/window.h.