В 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.