В 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.
Test AutoSingleLayer
Чтобы проверить, зафиксирован ли буфер без сигнала, найдите в Perfetto следующие трассировки от SurfaceFlinger:
Рисунок 1. Трассировка буфера без сигнала в Perfetto