В 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