Фиксация несигнального буфера с помощью 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