Na pilha gráfica, 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 por IPC. Antes do Android 14, esse cache de buffer não era eliminado quando um GraphicBufferProducer
se desconectava de um SurfaceFlinger GraphicBufferConsumer
, como quando um MediaCodec era desconectado de um SurfaceView. A partir do Android 14, você pode limpar esse cache de buffer à força para reduzir o consumo de memória gráfica.
Escolha uma das duas opções a seguir:
- Para dispositivos lançados com Android 14 e superior, você deve implementar a nova API Composer HAL versão 3.2. Esta opção é ativada por padrão e economiza mais memória. Dispositivos atualizados para 14 e posteriores também podem usar esta opção para obter benefícios totais de memória.
- Para dispositivos atualizados para o Android 14 para os quais você não deseja implementar a API Composer HAL 3.2, você pode ativar a opção de compatibilidade com versões anteriores. Esta 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 Composer HAL 3.2
Para obter todos os benefícios da memória do buffer gráfico, você deve:
- Atualize sua implementação do Composer HAL para a versão 3.2.
- Processe
LayerCommand::bufferSlotsToClear
limpando as entradas do cache do buffer indicadas pelos números de slot encontrados na lista.
As APIs do Composer HAL 3.2 relacionadas à memória do buffer gráfico, incluindo LayerCommand:bufferSlotsToClear
, estão em LayerCommand.aidl-
.
Habilite 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 espaço reservado 1x1, resultando em economia de memória para todos os slots eliminados, exceto para o slot de buffer ativo atual. Para obter benefícios parciais de economia de memória, habilite a opção de compatibilidade com versões anteriores definindo o sysprop surface_flinger.clear_slots_with_set_layer_buffer
como true
. Este sysprop é encontrado no arquivo property_contexts
.
Definir este sysprop requer que sua implementação HAL do Composer lide corretamente com vários comandos setLayerBuffer
para a mesma camada em um único ciclo presente.
A ativação da opção de compatibilidade com versões anteriores tem os seguintes efeitos:
Para HALs AIDL: SurfaceFlinger envia várias instâncias
LayerCommand
para uma única camada, cada uma com um únicoBufferCommand
. CadaBufferCommand
contém um identificador de buffer de espaço reservado 1x1 e um número de slot para o slot de buffer de cache que precisa ser eliminado.Para HALs HIDL: SurfaceFlinger envia vários
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Esses comandos contêm um identificador de buffer de espaço reservado 1x1 e um número de slot para o slot de buffer de cache que precisa ser eliminado.
A opção de compatibilidade com versões anteriores pode fazer com que o Composer HAL trave em alguns dispositivos. Você pode modificar seu HAL do Composer para resolver esse problema. O código que controla esse comportamento é encontrado aqui:
Teste o consumo de memória cache do buffer gráfico
Os testes não podem verificar se os slots de cache são eliminados pelas implementações HAL. No entanto, você pode usar suas ferramentas de depuração para monitorar o uso do buffer gráfico. Ao monitorar, você deverá 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.
Estão disponíveis testes VTS que verificam se a implementação 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 teste suficiente para funcionalidade adequada, pois alguns dispositivos passam nesses testes VTS, mas falham em casos de uso do mundo real.
Para novos testes VTS, navegue até 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