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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • В случае подключения нескольких устройств без подключения (hotplug) отключите и снова подключите два разных дисплея с разным разрешением.

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