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

В Android 13 появилась новая конфигурация под названием AutoSingleLayer для блокировки несигнальных буферов. Эта конфигурация позволяет SurfaceFlinger блокировать несигнальный буфер, когда обновляется только один слой. Она не применяется к случаям, когда обновление происходит между слоями, например, при изменении геометрии или синхронизирующих транзакциях.

Ранее флаг debug.sf.latch_unsignaled в проекте Android Open Source Project (AOSP) позволял SurfaceFlinger блокировать все несигнальные буферы независимо от сценария использования. Включение этой конфигурации может привести к нежелательным побочным эффектам, например, к нарушению синхронизационных транзакций и зависанию всего экрана во время ожидания незавершенных буферов.

В режиме AutoSingleLayer SurfaceFlinger обновляет только буфер одной поверхности в кадре. Этот режим позволяет играм и другим полноэкранным приложениям использовать преимущества блокировки неактивных буферов и уменьшать задержки в работе приложений, оставаясь при этом незатронутыми зависаниями экрана.

Настройки режима AutoSingleLayer

В Android 13 AutoSingleLayer является режимом по умолчанию для функции блокировки несигнального буфера. Этот режим управляется системным свойством debug.sf.auto_latch_unsignaled .

SurfaceFlinger считывает LatchUnsignaledConfig при загрузке. Возможные конфигурации:

  • LatchUnsignaledConfig::AutoSingleLayer

    В этом режиме по умолчанию AOSP SurfaceFlinger разрешает блокировку несигнализированных буферов при обновлении одного слоя в кадре. Обновление должно включать только обновление буфера без синхронизирующих транзакций или изменений геометрии. По умолчанию в этом режиме debug.sf.auto_latch_unsignaled установлен в true .

  • LatchUnsignaledConfig::Disabled

    В этом режиме отключается блокировка несигнальных транзакций, и блокируются только сигнальные транзакции. Этот режим также отключает режим AutoSingleLayer . Для настройки этого режима установите debug.sf.latch_unsignaled и debug.sf.auto_latch_unsignaled в значение false .

  • LatchUnsignaledConfig::Always

    В этом режиме SurfaceFlinger блокирует все буферы без сигнала. Чтобы настроить этот режим, установите debug.sf.latch_unsignaled в true .

Тестирование AutoSingleLayer

Чтобы проверить, зафиксирован ли буфер без сигнала, найдите следующие трассировки из SurfaceFlinger в Perfetto :

Трассировка защелкнутого несигнального буфера

Рисунок 1. Траектория защелкнутого несигнального буфера в Perfetto.