Начиная с Android 13, новые кадровые буферы, используемые при составлении клиента , выделяются при каждом изменении разрешения экрана. Это распределение выполняется SurfaceFlinger в следующем цикле аннулирования после изменения разрешения.
Управление кадровым буфером при переключении разрешения
Изменения разрешения происходят по одному из следующих двух сценариев:
Событие горячего подключения , инициируемое Hardware Composer (HWC), которое происходит при переключении с одного внешнего дисплея на другой внешний дисплей с другим разрешением по умолчанию.
Во время события горячего подключения дескрипторы старых кадровых буферов освобождаются, когда старые данные дисплея освобождаются.
Переключение режима отображения, инициируемое SurfaceFlinger, которое происходит, когда пользователь меняет разрешение с помощью пользовательских настроек или приложение меняет разрешение с помощью
preferredDisplayModeId
.Во время переключения режима отображения дескрипторы существующих клиентских кадровых буферов освобождаются SurfaceFlinger перед вызовом
setActiveConfig
илиsetActiveConfigWithConstraints
.
Чтобы избежать катастрофических проблем, таких как фрагментация памяти, на устройствах, которые не резервируют достаточно памяти для старых и новых фреймбуферов, очень важно, чтобы HWC прекратил использовать старые фреймбуферы и освободил все дескрипторы этих фреймбуферов, как показано в следующих случаях:
Для событий горячего подключения — непосредственно перед вызовом
onHotplug
.Для переключения режимов — сразу после вызова
setActiveConfig
илиsetActiveConfigWithConstraints
.
Освобождение дескрипторов позволяет полностью освободить память кадрового буфера перед выделением новых кадровых буферов, которое SurfaceFlinger выполняет во время следующего цикла аннулирования .
Рекомендации по управлению фреймбуфером
Если HWC не освобождает дескрипторы старых кадровых буферов вовремя, выделение нового кадрового буфера происходит до освобождения старого кадрового буфера. Это может вызвать катастрофические проблемы, если новое распределение не удастся из-за фрагментации или других проблем. Хуже того, если HWC вообще не освободит эти дескрипторы, может произойти утечка памяти.
Чтобы избежать катастрофических сбоев распределения, следуйте этим рекомендациям:
Если HWC необходимо продолжать использовать старые клиентские кадровые буферы до тех пор, пока не будут предоставлены новые клиентские кадровые буферы, тогда крайне важно зарезервировать достаточно памяти как для старого, так и для нового кадровых буферов и, возможно, запустить алгоритмы дефрагментации в пространстве памяти кадрового буфера.
Выделите выделенный пул памяти для кадровых буферов, отдельный от остальной памяти графического буфера. Это важно, поскольку между освобождением и перераспределением кадровых буферов сторонний процесс может попытаться выделить графическую память. Если тот же пул графической памяти используется кадровым буфером и если графическая память заполнена, сторонний процесс может занять графическую память, ранее выделенную кадровым буфером, таким образом оставляя недостаточно памяти для перераспределения кадрового буфера или, возможно, фрагментируя пространство памяти. .
Тестирование управления фреймбуфером
OEM-производителям рекомендуется проверить правильность управления памятью клиентского фреймбуфера с помощью переключателей разрешения для своего устройства, как описано ниже:
Для событий горячего подключения просто отключите и снова подключите два разных дисплея с разными разрешениями.
Для переключения режимов используйте тест
ModeSwitchingTestActivity
CTS Verifier, чтобы инициировать переключение режима для тестирования поведения памяти кадрового буфера. Этот тест позволяет визуально выявить проблемы, которые трудно обнаружить программно.