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