Reduzir o consumo de memória gráfica

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:

  1. Atualize a implementação da HAL do Composer para a versão 3.2.
  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 único BufferCommand. Cada BufferCommand 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 e SET_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: