Фиксация несигнального буфера с помощью AutoSingleLayer

В 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