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

Surface e SurfaceHolder

Os objetos de superfície permitem que os aplicativos renderizem imagens a serem apresentadas nas telas. As interfaces SurfaceHolder permitem que os aplicativos editem e controlem as superfícies.

Superfície

Uma superfície é uma interface para um produtor trocar buffers com um consumidor.

O BufferQueue para uma superfície de exibição é normalmente configurado para buffer triplo. Buffers são alocados sob demanda, portanto, se o produtor gerar buffers devagar o suficiente, como a 30 fps em uma exibição de 60 fps, pode haver apenas dois buffers alocados na fila. A alocação de buffers sob demanda ajuda a minimizar o consumo de memória. Você pode ver um resumo dos buffers associados a cada camada na saída do dumpsys SurfaceFlinger .

A maioria dos clientes renderiza em superfícies usando OpenGL ES ou Vulkan . No entanto, alguns clientes renderizam em superfícies usando uma tela.

Renderização de tela

A implementação do canvas é fornecida pela Skia Graphics Library . Se você quiser desenhar um retângulo, chame a API Canvas, que define bytes em um buffer apropriadamente. Para garantir que um buffer não seja atualizado por dois clientes ao mesmo tempo, ou gravado enquanto é exibido, bloqueie o buffer para acessá-lo. Use os seguintes comandos para trabalhar com bloqueios de tela:

  • lockCanvas() bloqueia o buffer para renderização na CPU e retorna um Canvas para usar no desenho.
  • unlockCanvasAndPost() desbloqueia o buffer e o envia para o compositor.
  • lockHardwareCanvas() bloqueia o buffer para renderização na GPU e retorna uma tela para usar no desenho.

Na primeira vez que o produtor solicita um buffer de um BufferQueue, o buffer é alocado e inicializado em zero. A inicialização é necessária para evitar o compartilhamento inadvertido de dados entre processos. No entanto, se você reutilizar um buffer, o conteúdo anterior ainda estará presente. Se você chamar repetidamente lockCanvas() e unlockCanvasAndPost() sem desenhar nada, o produtor unlockCanvasAndPost() ciclo entre os quadros renderizados anteriormente.

O código de bloqueio / desbloqueio de superfície mantém uma referência ao buffer renderizado anteriormente. Se você especificar uma região suja ao bloquear a superfície, ele copia os pixels não sujos do buffer anterior. SurfaceFlinger ou HWC normalmente manipulam o buffer; mas porque só precisamos ler do buffer, não há necessidade de esperar por acesso exclusivo.

SurfaceHolder

Um SurfaceHolder é uma interface que o sistema usa para compartilhar a propriedade de superfícies com aplicativos. Alguns clientes que trabalham com superfícies desejam um SurfaceHolder, porque APIs para obter e definir os parâmetros de superfície são implementados por meio de um SurfaceHolder. Um SurfaceView contém um SurfaceHolder.

A maioria dos componentes que interagem com uma vista envolve um SurfaceHolder. Algumas outras APIs, como MediaCodec, operam na própria superfície.