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