O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

SurfaceFlinger e WindowManager

SurfaceFlinger aceita buffers, compõe buffers e envia buffers para o display. WindowManager fornece SurfaceFlinger com buffers e metadados de janela, que SurfaceFlinger usa para superfícies compostas para a 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 SurfaceFlinger aceita buffers é por meio de BufferQueue e SurfaceControl. Quando um aplicativo vem para o primeiro plano, ele solicita buffers do WindowManager . WindowManager então solicita uma camada de SurfaceFlinger. Uma camada é uma combinação de uma superfície , que contém o BufferQueue e umSurfaceControl , 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 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 são atualizados 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 bloqueio, tempos de aquisição e assim por diante.

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

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

Pode ser criado como filho de ANativeWindow ou como filho de outro ASurfaceControl.
ASurfaceTransaction Wraps Transaction para permitir que o cliente edite as propriedades descritivas de uma camada, como geometria, e envia os buffers atualizados para SurfaceFlinger.
ASurfaceTransactionStats Envia informações sobre as transações que foram apresentadas, como tempo de bloqueio, 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ó é ativado para aceitar buffers entre as atualizações da tela, 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 durante a atualização.

Quando o visor está entre as atualizações, o visor envia o sinal VSYNC para SurfaceFlinger. O sinal VSYNC indica que a tela pode ser atualizada sem rasgar. Quando SurfaceFlinger recebe o sinal VSYNC, SurfaceFlinger percorre sua lista de camadas em busca de novos buffers. Se SurfaceFlinger encontrar um novo buffer, SurfaceFlinger adquirirá o buffer; caso contrário, o SurfaceFlinger continua a usar o buffer adquirido anteriormente. O SurfaceFlinger sempre deve exibir algo, portanto, fica em um buffer. Se nenhum buffer tiver sido enviado em uma camada, a camada será ignorada.

Depois que SurfaceFlinger coletar todos os buffers para 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 de cliente, o SurfaceFlinger compõe essas camadas. Em seguida, SurfaceFlinger passa o buffer de saída para o HWC .

WindowManager

WindowManager controla objetos de janela , que são recipientes para objetos de visualização . Objetos de janela são sempre apoiados por objetos de superfície. WindowManager supervisiona os 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. WindowManager envia todos os metadados da janela para SurfaceFlinger para que SurfaceFlinger possa usar esses dados para compor superfícies na tela.

Pré-rotação

Muitos overlays de hardware não suportam rotação (e mesmo que suportem, isso custa energia de processamento); a solução é transformar o buffer antes que ele alcance 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 por SurfaceFlinger. Os drivers GL podem usar essa dica para pré-transformar o buffer antes que ele alcance o SurfaceFlinger, de modo que, quando o buffer chegar, ele será transformado corretamente.

Por exemplo, ao receber uma dica para girar 90 graus, gere e aplique uma matriz ao buffer para evitar que 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 .