В 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