Управление клиентским фреймбуфером

Начиная с Android 13, новые буферы кадров, используемые во время клиентской композиции, выделяются всякий раз, когда изменяется разрешение дисплея. Это выделение выполняется SurfaceFlinger на следующем цикле invalidate после изменения разрешения.

Управление кадровым буфером во время переключения разрешения

Изменения разрешения происходят по одному из следующих двух сценариев:

  • Событие горячего подключения , инициируемое Hardware Composer (HWC), которое происходит при переключении с одного внешнего дисплея на другой внешний дисплей с другим разрешением по умолчанию.

    Во время события горячего подключения дескрипторы старых буферов кадров освобождаются, когда старые данные дисплея освобождаются.

  • Переключение режима отображения, инициированное SurfaceFlinger, которое происходит, когда пользователь изменяет разрешение с помощью пользовательских настроек или приложение изменяет разрешение с помощью preferredDisplayModeId .

    Во время переключения режима отображения SurfaceFlinger освобождает дескрипторы существующих клиентских фреймбуферов перед вызовом setActiveConfig или setActiveConfigWithConstraints .

Чтобы избежать катастрофических проблем, таких как фрагментация памяти, на устройствах, которые не резервируют достаточно памяти для старых и новых буферов кадров, крайне важно, чтобы HWC прекратил использовать старые буферы кадров и освободил все дескрипторы этих буферов кадров, как показано в следующих случаях:

  • Для событий горячего подключения — непосредственно перед вызовом onHotplug .

  • Для переключения режимов — сразу после вызова setActiveConfig или setActiveConfigWithConstraints .

Освобождение дескрипторов позволяет полностью освободить память буфера кадра перед выделением новых буферов кадра, которое SurfaceFlinger выполняет во время следующего цикла аннулирования .

Рекомендации по управлению кадровым буфером

Если HWC не освобождает дескрипторы старых буферов кадров вовремя, выделение нового буфера кадров происходит до освобождения старого буфера кадров. Это может вызвать катастрофические проблемы, когда новое выделение не удается из-за фрагментации или других проблем. Хуже того, если HWC вообще не освобождает эти дескрипторы, может произойти утечка памяти.

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

  • Если HWC необходимо продолжать использовать старые клиентские фреймбуферы до тех пор, пока не будут предоставлены новые клиентские фреймбуферы, то крайне важно зарезервировать достаточно памяти как для старых, так и для новых фреймбуферов и, возможно, запустить алгоритмы дефрагментации в пространстве памяти фреймбуфера.

  • Выделите выделенный пул памяти для буферов кадров, который отделен от остальной памяти графического буфера. Это важно, поскольку между освобождением и перераспределением буферов кадров сторонний процесс может попытаться выделить графическую память. Если тот же пул графической памяти используется буфером кадров и если графическая память заполнена, сторонний процесс может занять графическую память, ранее выделенную буфером кадров, тем самым оставив недостаточно памяти для перераспределения буфера кадров или, возможно, фрагментируя пространство памяти.

Тестовое управление кадровым буфером

OEM-производителям рекомендуется протестировать правильность управления памятью клиентского буфера кадров на всех переключателях разрешения для своих устройств, как описано ниже:

  • В случае горячего подключения просто отключите и снова подключите два разных дисплея с разными разрешениями.

  • Для переключения режимов используйте тест ModeSwitchingTestActivity CTS Verifier, чтобы инициировать переключение режимов для тестирования поведения памяти кадрового буфера. Этот тест может визуально определить проблемы, которые трудно обнаружить программно.