A partir de 27 de março de 2025, recomendamos usar android-latest-release em vez de aosp-main para criar e contribuir com o AOSP. Para mais informações, consulte Mudanças no AOSP.
Travamento de buffers não sinalizados com a AutoSingleLayer
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
O Android 13 adiciona uma nova configuração chamada
AutoSingleLayer para travar
buffers não sinalizados. Essa configuração permite que o SurfaceFlinger use um buffer não sinalizado
quando uma única camada está sendo atualizada, mas não para os casos que ocorrem
em várias camadas, como mudanças de geometria ou transações de sincronização.
Antes do Android 13, a flag debug.sf.latch_unsignaled
no AOSP permitia que o SurfaceFlinger travasse todos os buffers não sinalizados, independentemente do caso
de uso. Quando essa configuração é ativada, há efeitos colaterais indesejados, como
interromper transações de sincronização e congelar toda a tela enquanto espera por
buffers incompletos.
Com o modo AutoSingleLayer, apenas um buffer de uma única superfície é atualizado
em um frame. Esse modo permite que jogos e outros apps de tela cheia aproveitem
a vantagem de fixar buffers não sinalizados e reduzir o travamento do app, sem serem afetados
por congelamentos na tela.
O SurfaceFlinger lê LatchUnsignaledConfig na inicialização.
Confira as configurações possíveis:
LatchUnsignaledConfig::AutoSingleLayer
Nesse modo padrão do AOSP, a fixação de buffers não sinalizados é permitida quando uma
única camada é atualizada em um frame, e a atualização inclui apenas uma atualização
de buffer sem transações de sincronização ou mudanças de geometria. Nesse modo, debug.sf.auto_latch_unsignaled
é definido como true por padrão.
LatchUnsignaledConfig::Disabled
Esse modo desativa o comportamento não sinalizado da trava e fixa apenas transações
sinalizadas. Esse modo também desativa o modo AutoSingleLayer. Para
configurar esse modo, defina debug.sf.latch_unsignaled e
debug.sf.auto_latch_unsignaled como false.
LatchUnsignaledConfig::Always
Nesse modo, todos os buffers são fixados sem sinalização. Para configurar esse modo, defina
debug.sf.latch_unsignaled como true.
Teste AutoSingleLayer
Para testar se um buffer está travado sem sinalização, procure os seguintes rastros
do SurfaceFlinger no Perfetto:
Figura 1. Rastreamento de um buffer não sinalizado travado no Perfetto
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-07-27 UTC."],[],[],null,["# Unsignaled buffer latching with AutoSingleLayer\n\nAndroid 13 adds a new configuration called\n[`AutoSingleLayer`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.h#160) for latching\nunsignaled buffers. This configuration lets SurfaceFlinger latch an unsignaled\nbuffer when only a single layer is updating, and not for the cases that occur\nacross layers, such as geometry changes or sync transactions.\n\nBefore Android 13, the `debug.sf.latch_unsignaled` flag\nin AOSP lets SurfaceFlinger latch all unsignaled buffers, regardless of the use\ncase. When this configuration is enabled, there are undesired side effects, such\nas breaking sync transactions and freezing the entire display while waiting on\nincomplete buffers.\n\nWith the `AutoSingleLayer` mode, only a buffer of a single surface is updated\nin a frame. This mode enables games and other fullscreen apps to get the benefit\nof latching unsignaled buffers and reducing app jank while remaining unaffected\nby display freezes.\n\nAutoSingleLayer mode settings\n-----------------------------\n\nIn Android 13,\n[`AutoSingleLayer`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.h#160) is the default\nmode for the latch unsignaled buffer feature. This mode is controlled by the\nsystem property [`debug.sf.auto_latch_unsignaled`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#454).\n\nSurfaceFlinger reads [`LatchUnsignaledConfig`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#449) on boot.\nHere are the possible configurations:\n\n- `LatchUnsignaledConfig::AutoSingleLayer`\n\n In this AOSP default mode, latching unsignaled buffers is permitted when a\n single layer is updated in a frame, and the update includes just a buffer\n update with no sync transactions or geometry changes. In this mode, [`debug.sf.auto_latch_unsignaled`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#454)\n is set to `true` by default.\n- `LatchUnsignaledConfig::Disabled`\n\n This mode disables the latch unsignaled behavior and latches only signaled\n transactions. This mode also disables the `AutoSingleLayer` mode. To\n configure this mode, set [`debug.sf.latch_unsignaled`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#450) and\n [`debug.sf.auto_latch_unsignaled`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#454) to `false`.\n- `LatchUnsignaledConfig::Always`\n\n In this mode, all buffers are latched unsignaled. To configure this mode, set\n [`debug.sf.latch_unsignaled`](https://android.googlesource.com/platform/frameworks/native/+/refs/heads/android16-release/services/surfaceflinger/SurfaceFlinger.cpp#450) to `true`.\n | **Note:** This mode takes priority over setting `AutoSingleLayer` but can cause display freezing and other undesired effects. This mode might be deprecated in future releases.\n\nTest `AutoSingleLayer`\n----------------------\n\nTo test whether a buffer is latched unsignaled, look for the following traces\nfrom SurfaceFlinger in [Perfetto](https://developer.android.com/topic/performance/tracing):\n\n**Figure 1.** Trace of a latched unsignaled buffer in Perfetto"]]