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