O Android 13 adiciona uma nova configuração chamada AutoSingleLayer
para travar buffers não sinalizados. Essa configuração permite que o SurfaceFlinger bloqueie um buffer não sinalizado quando apenas uma única camada está sendo atualizada, e não para os casos que ocorrem entre camadas, como alterações de geometria ou transações de sincronização.
Antes do Android 13, o sinalizador debug.sf.latch_unsignaled
no AOSP permitia que o SurfaceFlinger travasse todos os buffers não sinalizados, independentemente do caso de uso. Quando esta configuração está habilitada, há efeitos colaterais indesejados, como interrupção de transações de sincronização e congelamento de toda a exibição enquanto aguarda buffers incompletos.
Com o modo AutoSingleLayer
, apenas um buffer de uma única superfície é atualizado em um quadro. Este modo permite que jogos e outros aplicativos em tela cheia obtenham o benefício de bloquear buffers não sinalizados e reduzir a instabilidade do aplicativo, sem serem afetados por congelamentos de exibição.
Configurações do modo AutoSingleLayer
No Android 13, AutoSingleLayer
é o modo padrão para o recurso de buffer não sinalizado de trava. Este modo é controlado pela propriedade do sistema debug.sf.auto_latch_unsignaled
.
SurfaceFlinger lê LatchUnsignaledConfig
na inicialização. Aqui estão as configurações possíveis:
LatchUnsignaledConfig::AutoSingleLayer
Neste modo padrão do AOSP, o travamento de buffers não sinalizados é permitido quando uma única camada é atualizada em um quadro, e a atualização inclui apenas uma atualização de buffer sem transações de sincronização ou alterações de geometria. Neste modo,
debug.sf.auto_latch_unsignaled
é definido comotrue
por padrão.LatchUnsignaledConfig::Disabled
Este modo desativa o comportamento não sinalizado do latch e bloqueia apenas transações sinalizadas. Este modo também desativa o modo
AutoSingleLayer
. Para configurar este modo, definadebug.sf.latch_unsignaled
edebug.sf.auto_latch_unsignaled
comofalse
.LatchUnsignaledConfig::Always
Neste modo, todos os buffers são travados sem sinalização. Para configurar este modo, defina
debug.sf.latch_unsignaled
comotrue
.
Teste AutoSingleLayer
Para testar se um buffer está travado sem sinalização, procure os seguintes rastreamentos de SurfaceFlinger em Perfetto :
Figura 1. Rastreamento de um buffer não sinalizado travado no Perfetto