В Android 13 представлена новая конфигурация AutoSingleLayer
для фиксации несигнализированных буферов. Эта конфигурация позволяет SurfaceFlinger фиксировать несигнализированный буфер при обновлении только одного слоя. Она не применяется к случаям, происходящим между слоями, например, при изменении геометрии или транзакциях синхронизации.
Ранее флаг debug.sf.latch_unsignaled
в Android Open Source Project (AOSP) позволял SurfaceFlinger блокировать все несигнальные буферы, независимо от варианта использования. Включение этой конфигурации может привести к нежелательным побочным эффектам, например, к прерыванию транзакций синхронизации и заморозке всего дисплея в ожидании неполных буферов.
В режиме AutoSingleLayer
SurfaceFlinger обновляет только буфер одной поверхности в кадре. Этот режим позволяет играм и другим полноэкранным приложениям использовать функцию фиксации несигнализированных буферов и снижать зависания приложений, не страдая при этом от зависаний экрана.
Настройки режима AutoSingleLayer
В Android 13 AutoSingleLayer
является режимом по умолчанию для функции защелкивания несигнализированного буфера. Этот режим управляется системным свойством debug.sf.auto_latch_unsignaled
.
SurfaceFlinger считывает LatchUnsignaledConfig
при загрузке. Возможные конфигурации:
LatchUnsignaledConfig::AutoSingleLayer
В этом режиме AOSP по умолчанию SurfaceFlinger разрешает блокировку несигнализированных буферов при обновлении одного слоя в кадре. Обновление должно включать только обновление буфера без синхронизирующих транзакций или изменений геометрии. По умолчанию в этом режиме
debug.sf.auto_latch_unsignaled
устанавливается вtrue
.LatchUnsignaledConfig::Disabled
Этот режим отключает поведение защелки без сигнала и блокирует только сигнальные транзакции. Этот режим также отключает режим
AutoSingleLayer
. Чтобы настроить этот режим, установитеdebug.sf.latch_unsignaled
иdebug.sf.auto_latch_unsignaled
в значениеfalse
.LatchUnsignaledConfig::Always
В этом режиме SurfaceFlinger блокирует все буферы в несигнальном состоянии. Чтобы настроить этот режим, установите
debug.sf.latch_unsignaled
вtrue
.
Тест AutoSingleLayer
Чтобы проверить, заблокирован ли буфер в несигнальном состоянии, найдите следующие следы от SurfaceFlinger в Perfetto :
Рисунок 1. След защелкнутого несигнального буфера в Perfetto