В графическом стеке послойный буферный кеш находится между Composer HAL и SurfaceFlinger, чтобы уменьшить накладные расходы, связанные с отправкой файловых дескрипторов через IPC. До Android 14 этот буферный кеш не очищался, когда GraphicBufferProducer
отключается от SurfaceFlinger GraphicBufferConsumer
, например, когда MediaCodec отключается от SurfaceView. Начиная с Android 14, вы можете принудительно очистить этот буферный кеш, чтобы уменьшить потребление графической памяти.
Выберите один из двух следующих вариантов:
- Для запуска устройств с Android 14 и выше, вы должны реализовать новый композитор HAL API версии 3.2. Эта опция активируется по умолчанию и сохраняет наибольшую память. Устройства, обновляющиеся до версии 14 и более поздних версий, также могут использовать эту опцию для достижения полного преимущества памяти.
- Для устройств, обновляющихся до Android 14, для которых вы не хотите внедрять Composer HAL 3.2 API, вы можете включить опцию обратной совместимости. Этот вариант экономит почти столько же памяти, как и предыдущий вариант.
В следующих двух разделах объясняется, как реализовать каждую опцию.
Внедрить API Composer HAL 3.2.
Чтобы получить все преимущества памяти графического буфера, необходимо:
- Обновите реализацию HAL Composer до версии 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
.
Установка этого системного свойства требует, чтобы ваша реализация 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 перейдите по следующим ссылкам:
Совместимость с HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Совместимость с AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear
В графическом стеке послойный буферный кеш находится между 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.
Чтобы получить все преимущества памяти графического буфера, необходимо:
- Обновите реализацию HAL Composer до версии 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
.
Setting this sysprop requires your Composer HAL implementation to correctly handle multiple setLayerBuffer
commands for the same layer in a single present cycle.
Включение опции обратной совместимости имеет следующие последствия:
Для 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 перейдите по следующим ссылкам:
Совместимость с HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Совместимость с AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear