В графическом стеке между 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.
Для получения всех преимуществ буферной памяти графики необходимо:
- Обновите реализацию Composer HAL до версии 3.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 перейдите по следующим ссылкам: