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