Reduzir o consumo de memória gráfica

Na pilha de gráficos, um cache de buffer por camada fica entre o HAL do Composer e o SurfaceFlinger para reduzir a sobrecarga associada ao envio de descritores de arquivo por IPC. Antes do Android 14, o sistema não limpava esse cache de buffer quando um GraphicBufferProducer se desconectava do GraphicBufferConsumer do SurfaceFlinger, por exemplo, quando um MediaCodec se desconectava de uma SurfaceView. No Android 14 e versões mais recentes, é possível limpar à força esse cache de 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 salva a quantidade máxima de memória. Os dispositivos que fizerem upgrade para a versão 14 e mais recentes também podem usar essa opção para aproveitar todos os benefícios da memória.
  • Para dispositivos que fizerem upgrade para o Android 14 e que não quiserem implementar a API HAL 3.2 do Composer, é possível ativar a opção compatível com versões anteriores. Essa opção salva 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 HAL 3.2 do Composer

Para aproveitar todos os benefícios da memória do buffer de gráficos, é necessário:

  1. Atualizar a implementação do HAL do Composer para a versão 3.2.
  2. Processar LayerCommand::bufferSlotsToClear limpando as entradas de cache de buffer indicadas pelos números de slot encontrados na lista.

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

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 de marcador de posição 1x1. Isso resulta em economia de memória para todos os slots limpos, exceto o slot de buffer ativo atual. Para aproveitar os 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 é encontrada no property_contexts arquivo.

A definição dessa sysprop exige que a implementação do HAL do Composer processe corretamente vários comandos setLayerBuffer para a mesma camada em um único ciclo.

A ativação da 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 exige limpeza.

  • Para HALs HIDL: o SurfaceFlinger envia vários comandos SELECT_DISPLAY, SELECT_LAYER, 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 exige limpeza.

A opção compatível com versões anteriores pode causar falhas no 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 de gráficos

Os testes não podem verificar se as implementações de HAL limpam os slots de cache. No entanto, é possível usar as ferramentas de depuração para monitorar o uso do buffer de gráficos. Ao monitorar, você poderá notar menos erros de falta de memória em cenários em que vários vídeos diferentes são interrompidos e iniciados rapidamente no YouTube.

Os testes do VTS estão disponíveis para verificar se a implementação do 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 a funcionalidade adequada, já que alguns dispositivos passam nesses testes do VTS, mas falham durante casos de uso reais.

Para novos testes do VTS, consulte os links a seguir: