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