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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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