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:
- Atualize a implementação da HAL do Composer para a versão 3.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 únicoBufferCommand
. CadaBufferCommand
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
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 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:
Compatível com HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatível com AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear