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