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

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

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

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

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

Внедрить API Composer HAL 3.2.

Чтобы получить все преимущества памяти графического буфера, необходимо:

  1. Обновите реализацию HAL Composer до версии 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 .

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

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

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

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

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

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

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

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

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