Na pilha de gráficos, um cache de buffer por camada fica entre o Composer HAL e o
SurfaceFlinger para reduzir a sobrecarga associada ao envio de descritores de arquivo
pelo IPC. Antes do Android 14, esse cache de buffer
não era limpo quando um
GraphicBufferProducer
se desconectava de um
GraphicBufferConsumer
do SurfaceFlinger, como quando um
MediaCodec era desconectado de um SurfaceView. No Android
14 e versões mais recentes, é possível limpar à força esse cache para
reduzir o consumo de memória gráfica.
Escolha uma das duas opções a seguir:
- Para dispositivos lançados com o Android 14 e versões mais recentes, é necessário implementar a nova versão 3.2 da API HAL do Composer. Essa opção é ativada por padrão e economiza mais memória. Os dispositivos que fizerem upgrade para o Android 14 e versões mais recentes também podem usar essa opção para aproveitar todos os benefícios da memória.
- Para dispositivos que estão sendo atualizados para o Android 14 e em que você não quer implementar a API Composer HAL 3.2, é possível ativar a opção compatível com versões anteriores. Essa opção economiza quase tanta memória quanto a opção anterior.
As duas seções a seguir explicam como implementar cada opção.
Implementar a API HAL 3.2 do Composer
Para aproveitar todos os benefícios da memória gráfica do buffer, você precisa:
- Atualize a implementação da HAL do Composer para a versão 3.2.
- Processe
LayerCommand::bufferSlotsToClear
limpando as entradas do cache de buffer indicadas pelos números de slot encontrados na lista.
As APIs do Composer HAL 3.2 relacionadas à memória de buffer gráfico, incluindo
LayerCommand:bufferSlotsToClear
, estão em
LayerCommand.aidl-
.
Ativar a opção compatível com versões anteriores
A opção de redução de memória compatível com versões anteriores substitui um buffer real no slot de cache por um buffer marcador de posição 1x1, resultando em economia de memória para todos os slots limpos, exceto o slot de buffer ativo atual. Para aproveitar
benefícios parciais de economia de memória, ative a opção compatível com versões anteriores
definindo a sysprop surface_flinger.clear_slots_with_set_layer_buffer
como
true
. Essa sysprop está no arquivo
property_contexts
.
Para definir essa sysprop, é necessário que sua implementação do HAL do Composer processe corretamente
vários comandos setLayerBuffer
para a mesma camada em um único
ciclo de apresentação.
Ativar a opção compatível com versões anteriores tem os seguintes efeitos:
Para HALs AIDL: o SurfaceFlinger envia várias instâncias
LayerCommand
para uma única camada, cada uma com um únicoBufferCommand
. CadaBufferCommand
contém um identificador de buffer de marcador de posição 1x1 e um número de slot para o slot de buffer de cache que precisa ser limpo.Para HALs HIDL: o SurfaceFlinger envia vários comandos
SELECT_DISPLAY
,SELECT_LAYER
eSET_BUFFER
. Esses comandos contêm um identificador de buffer de marcador de posição 1x1 e um número de slot para o slot de buffer de cache que precisa ser limpo.
A opção compatível com versões anteriores pode causar falhas na HAL do Composer em alguns dispositivos. Talvez seja possível modificar o HAL do Composer para resolver esse problema. O código que controla esse comportamento está aqui:
Testar o consumo de memória do cache do buffer gráfico
Os testes não podem verificar se os slots de cache são limpos pelas implementações de HAL. No entanto, é possível usar as ferramentas de depuração para monitorar o uso do buffer gráfico. Ao monitorar, você vai notar que há menos erros de falta de memória em cenários em que vários vídeos diferentes são interrompidos e iniciados em rápida sucessão no YouTube.
Há testes do VTS disponíveis que verificam se a implementação da HAL é
funcionalmente capaz de receber as novas chamadas de API (HAL versão 3.2 ou mais recente) ou
vários comandos setLayerBuffer
para a implementação
compatível com versões anteriores. No entanto, isso não deve ser considerado um teste suficiente para
funcionalidade adequada, já que alguns dispositivos passam nesses testes do VTS,
mas falham durante casos de uso no mundo real.
Para novos testes do VTS, acesse os seguintes links:
Compatível com HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatível com AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear