Reduzir o consumo de memória gráfica

Na pilha de gráficos, um cache de buffer por camada fica entre a HAL do Composer e o SurfaceFlinger para reduzir a sobrecarga associada ao envio de descritores de arquivos pela 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. A partir do Android 14, é possível limpar à força esse cache do buffer 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 fazem upgrade para 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 para os quais você não quer implementar a API Composer HAL 3.2, ative a opção compatível com versões anteriores. Essa opção economiza quase a mesma quantidade de memória que a anterior.

As duas seções a seguir explicam como implementar cada opção.

Implementar a API Composer HAL 3.2

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 de cache do buffer indicadas pelos números de slot encontrados na lista.

As APIs do HAL 3.2 do Composer relacionadas à memória de buffer gráfico, incluindo LayerCommand:bufferSlotsToClear, estão em LayerCommand.aidl-.

Ativar a opção de compatibilidade 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 de marcador de posição 1x1, resultando na economia de memória para todos os slots limpos, exceto no slot do buffer ativo atual. Para conseguir benefícios parciais de economia de memória, ative a opção compatível com versões anteriores definindo o sysprop surface_flinger.clear_slots_with_set_layer_buffer como true. Esse sysprop é encontrado no arquivo property_contexts.

A configuração desse sysprop exige que a 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 de LayerCommand para uma única camada, cada uma com um único BufferCommand. Cada BufferCommand contém um identificador de buffer de marcador 1x1 e um número de slot para o slot do buffer de cache que precisa ser expurgado.

  • 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 do 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 do 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.

Os testes VTS estão disponíveis para verificar se a implementação da HAL é funcionalmente capaz de receber as novas chamadas de API (HAL versão 3.2+) 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 funções adequadas, já que alguns dispositivos passam nesses testes de VTS, mas falham durante casos de uso reais.

Para novos testes de VTS, acesse estes links: