O Android 13 adiciona uma nova configuração chamada AutoSingleLayer
para bloquear buffers não sinalizados. Essa configuração permite que SurfaceFlinger trave um buffer não sinalizado quando apenas uma única camada está atualizando, 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 essa configuração é habilitada, há efeitos colaterais indesejados, como quebrar transações de sincronização e congelar toda a exibição enquanto espera por 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 travar buffers não sinalizados e reduzir a instabilidade do aplicativo enquanto permanecem inalterados por congelamentos de exibição.
Configurações do modo AutoSingleLayer
No Android 13, AutoSingleLayer
é o modo padrão para o recurso de travamento de buffer não sinalizado. 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 AOSP, travar 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. Nesse modo,
debug.sf.auto_latch_unsignaled
é definido comotrue
por padrão.LatchUnsignaledConfig::Disabled
Este modo desativa o comportamento de trava não sinalizada e trava apenas as transações sinalizadas. Este modo também desativa o modo
AutoSingleLayer
. Para configurar esse modo, definadebug.sf.latch_unsignaled
edebug.sf.auto_latch_unsignaled
comofalse
.LatchUnsignaledConfig::Always
Neste modo, todos os buffers são travados sem sinal. Para configurar esse modo, defina
debug.sf.latch_unsignaled
comotrue
.
Testar AutoSingleLayer
Para testar se um buffer está travado sem sinal, procure os seguintes traços do SurfaceFlinger no Perfetto :
Figura 1. Rastreamento de um buffer não sinalizado travado no Perfetto