Уменьшите потребление графической памяти

В графическом стеке между Composer HAL и SurfaceFlinger находится буферный кэш для каждого слоя, предназначенный для уменьшения накладных расходов, связанных с отправкой файловых дескрипторов по межпроцессному взаимодействию (IPC). До Android 14 система не очищала этот буферный кэш, когда GraphicBufferProducer отключался от GraphicBufferConsumer SurfaceFlinger, например, когда MediaCodec отключался от SurfaceView. Начиная с Android 14, вы можете принудительно очистить этот буферный кэш, чтобы уменьшить потребление графической памяти.

Выберите один из двух следующих вариантов:

  • Для устройств, выпущенных с Android 14 и выше, необходимо внедрить новый API Composer HAL версии 3.2. Эта опция активируется по умолчанию и позволяет максимально экономить память. Устройства, обновляющиеся до Android 14 и выше, также могут использовать эту опцию для получения всех преимуществ, связанных с использованием памяти.
  • Для устройств, обновляющихся до Android 14, для которых вы не хотите использовать API Composer HAL 3.2, можно включить опцию обратной совместимости. Эта опция экономит почти столько же памяти, сколько и предыдущая.

В следующих двух разделах объясняется, как реализовать каждый из вариантов.

Реализуйте API Composer HAL 3.2.

Для получения всех преимуществ буферной памяти графики необходимо:

  1. Обновите реализацию Composer HAL до версии 3.2.
  2. Обработайте LayerCommand::bufferSlotsToClear , очистив записи буферного кэша, указанные номерами слотов, найденными в списке.

API-интерфейсы Composer HAL 3.2, связанные с памятью графического буфера, включая LayerCommand::bufferSlotsToClear , находятся в файле LayerCommand.aidl .

Включите параметр обратной совместимости.

Опция обратного соответствия для сокращения памяти заменяет реальный буфер в слоте кэша на буфер-заполнитель размером 1x1. Это приводит к экономии памяти для всех очищенных слотов, кроме текущего активного буферного слота. Для достижения частичной экономии памяти включите опцию обратного соответствия, установив параметр surface_flinger.clear_slots_with_set_layer_buffer в значение true . Этот параметр находится в файле property_contexts .

Для установки этого параметра sysprop требуется, чтобы ваша реализация Composer HAL корректно обрабатывала несколько команд setLayerBuffer для одного и того же слоя в одном цикле отображения.

Включение опции обратной совместимости приводит к следующим последствиям:

  • Для AIDL HAL: SurfaceFlinger отправляет несколько экземпляров LayerCommand для одного слоя, каждый с одним BufferCommand . Каждый BufferCommand содержит дескриптор буфера-заполнителя размером 1x1 и номер слота для буфера кэша, который необходимо очистить.

  • Для HAL-интерфейсов HIDL: SurfaceFlinger отправляет несколько команд SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER . Эти команды содержат дескриптор буфера-заполнителя размером 1x1 и номер слота для кэш-буфера, который необходимо очистить.

Опция обратной совместимости может привести к сбою Composer HAL на некоторых устройствах. Возможно, вы сможете изменить свой Composer HAL, чтобы решить эту проблему. Код, управляющий этим поведением, находится здесь:

Тестирование потребления памяти графического буферного кэша

Тесты не могут проверить, очищают ли реализации HAL кэш-слоты. Однако вы можете использовать инструменты отладки для мониторинга использования графического буфера. В процессе мониторинга вы можете заметить уменьшение количества ошибок нехватки памяти в сценариях, когда на YouTube быстро останавливается и запускается несколько разных видеороликов.

Доступны тесты VTS, которые проверяют, что реализация HAL функционально способна принимать новые вызовы API (HAL версии 3.2+) или несколько команд setLayerBuffer для обратно совместимой реализации. Однако этого не следует считать достаточным тестированием для обеспечения корректной работы, поскольку некоторые устройства проходят эти тесты VTS, но терпят неудачу в реальных условиях эксплуатации.

Для ознакомления с новыми тестами VTS перейдите по следующим ссылкам: