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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверка управления фреймбуфером

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

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

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