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