En la pila de gráficos, un caché de búfer por capa se encuentra entre Composer HAL y SurfaceFlinger para reducir la sobrecarga asociada con el envío de descriptores de archivos a través de IPC. Antes de Android 14, este caché de búfer no se purgaba cuando un GraphicBufferProducer
se desconecta de un SurfaceFlinger GraphicBufferConsumer
, como cuando un MediaCodec se desconecta de un SurfaceView. A partir de Android 14, puede purgar por la fuerza este caché de búfer para reducir el consumo de memoria de gráficos.
Elija entre una de las dos opciones siguientes:
- Para dispositivos que se inician con Android 14 y superior, debe implementar la nueva versión 3.2 de Composer HAL API. Esta opción está activada por defecto y ahorra la mayor cantidad de memoria. Los dispositivos que se actualizan a 14 y posteriores también pueden usar esta opción para obtener todos los beneficios de la memoria.
- Para los dispositivos que se actualizan a Android 14 para los cuales no desea implementar la API Composer HAL 3.2, puede habilitar la opción de compatibilidad con versiones anteriores. Esta opción ahorra casi tanta memoria como la opción anterior.
Las siguientes dos secciones explican cómo implementar cada opción.
Implementar la API Composer HAL 3.2
Para lograr todos los beneficios de la memoria del búfer de gráficos, debe:
- Actualice su implementación de Composer HAL a la versión 3.2.
- Procese
LayerCommand::bufferSlotsToClear
purgando las entradas de la caché del búfer indicadas por los números de ranura que se encuentran en la lista.
Las API de Composer HAL 3.2 relacionadas con la memoria intermedia gráfica, incluida LayerCommand:bufferSlotsToClear
, se encuentran en LayerCommand.aidl-
.
Habilite la opción de compatibilidad con versiones anteriores
La opción de reducción de memoria compatible con versiones anteriores reemplaza un búfer real en la ranura de caché con un búfer de marcador de posición 1x1, lo que genera ahorros de memoria para todas las ranuras purgadas, excepto para la ranura de búfer activa actual. Para lograr beneficios de ahorro parcial de memoria, habilite la opción compatible con versiones anteriores configurando el sysprop surface_flinger.clear_slots_with_set_layer_buffer
en true
. Este sysprop se encuentra en el archivo property_contexts
.
Configurar este sysprop requiere que la implementación de Composer HAL maneje correctamente múltiples comandos setLayerBuffer
para la misma capa en un único ciclo presente.
Habilitar la opción compatible con versiones anteriores tiene los siguientes efectos:
Para AIDL HAL: SurfaceFlinger envía varias instancias
LayerCommand
para una sola capa, cada una con un únicoBufferCommand
. CadaBufferCommand
contiene un identificador de búfer de marcador de posición 1x1 y un número de ranura para la ranura del búfer de caché que debe purgarse.Para HAL HIDL: SurfaceFlinger envía múltiples comandos
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
. Estos comandos contienen un controlador de búfer de marcador de posición 1x1 y un número de ranura para la ranura del búfer de caché que debe purgarse.
La opción de compatibilidad con versiones anteriores puede provocar que Composer HAL falle en algunos dispositivos. Es posible que pueda modificar su Composer HAL para resolver este problema. El código que controla este comportamiento se encuentra aquí:
Pruebe el consumo de memoria caché del búfer de gráficos
Las pruebas no pueden verificar si las implementaciones HAL eliminan las ranuras de caché. Sin embargo, puede utilizar sus herramientas de depuración para monitorear el uso del búfer gráfico. Mientras realiza el seguimiento, debería notar que hay menos errores de falta de memoria en escenarios en los que se detienen e inician varios videos diferentes en rápida sucesión en YouTube.
Hay pruebas VTS disponibles que verifican que la implementación HAL sea funcionalmente capaz de recibir las nuevas llamadas API (HAL versión 3.2+) o múltiples comandos setLayerBuffer
para la implementación compatible con versiones anteriores. Sin embargo, esto no debe considerarse prueba suficiente para una funcionalidad adecuada, ya que algunos dispositivos pasan estas pruebas VTS, pero fallan en casos de uso del mundo real.
Para nuevas pruebas VTS, navegue a los siguientes enlaces:
Compatible con HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatible con AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear