As sessões lentas são uma nova métrica do Android vitals no Google Play Console. Uma sessão lenta é aquela em que mais de 25% dos frames são lentos. Um frame é lento se não for apresentado em menos de 50 ms após o frame anterior (equivalente a 20 QPS). O Android vitals também informa uma segunda métrica de sessões lentas com uma meta de 34 ms (equivalente a 30 QPS). Com as sessões lentas, é possível entender o desempenho do frame rate do jogo, o que afeta a fluidez dele para os usuários.
No futuro, o Google Play vai direcionar os usuários a outras opções quando os jogos não alcançarem 20 QPS no smartphone. O Android vitals só começa a monitorar a taxa de frames depois que o jogo é executado por um minuto.
Acesse a Central de Ajuda para mais detalhes sobre a métrica.

Como medir QPS e detectar frames lentos
O comando dumpsys surfaceflinger timestats
do Android fornece um histograma de tempo de QPS médio e
atual para apresentar para todas as camadas que estão sendo
renderizadas. O tempo de apresentação para apresentação de um frame é o intervalo entre
o frame atual e o anterior que está sendo renderizado. Confira
as etapas para usar o comando e coletar os QPS do jogo:
Execute o comando com as flags
enable
eclear
para começar a capturar informações:adb shell dumpsys SurfaceFlinger --timestats -clear -enable
Quando o jogo for jogado por tempo suficiente, execute o comando novamente com a flag
dump
para descartar informações:adb shell dumpsys SurfaceFlinger --timestats -dump
As informações descartadas fornecem o total de frames e o histograma presentToPresent para todas as camadas renderizadas pelo SurfaceFlinger. Você precisa encontrar a seção do jogo filtrando com base em
layerName
:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
A taxa de frames lenta da sessão pode ser calculada com base nas informações de cada camada.
Por exemplo, a porcentagem de frames lentos de 20 QPS = (soma de valores de 54 ms a 1.000 ms) / totalFrames x 100
totalFrames = 274 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0 66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
O FPS médio de cada camada também é mostrado no dump:
... averageFPS = 30.179 ...
Depois de coletar todas as informações, desative as estatísticas de tempo usando a flag
disable
:adb shell dumpsys SurfaceFlinger --timestats -disable
Causas e soluções para frames lentos
Há muitos motivos para um frame aparecer ou renderizar por mais tempo na tela do que o alvo do desenvolvedor. O jogo pode estar limitado à CPU/GPU. Ou o dispositivo superaquece e ativa um estado térmico limitado. Ou há uma incompatibilidade na taxa de frames do jogo e na taxa de atualização da tela do dispositivo.
Use o Android Frame Pacing (Swappy), Vulkan e ADPF para resolver esses problemas e melhorar o desempenho do jogo.
O que é o Swappy?
A biblioteca Frame Pacing do Android, também conhecida como Swappy, faz parte das bibliotecas do AGDK. O Swappy ajuda os jogos OpenGL e Vulkan a renderizar e corrigir o ritmo de frames no Android.
O ritmo de frame é a sincronização da lógica e do loop de renderização de um jogo com o subsistema de exibição de um SO e o hardware de exibição. O subsistema de exibição do Android foi projetado para evitar artefatos visuais (conhecidos como tearing) que podem ocorrer quando o hardware de exibição muda para um novo frame no meio de uma atualização. Para evitar esses artefatos, o subsistema de exibição faz o seguinte:
- Armazena frames anteriores em buffer internamente
- Detecta envios de frames atrasados
- Repete a exibição de frames anteriores quando frames atrasados são detectados
Saiba como a Mir 2 usou o Swappy para reduzir a taxa de sessões lentas de 40% para 10%.
Como usar o Swappy em projetos nativos
Consulte os guias a seguir para integrar a biblioteca Android Frame Pacing ao seu jogo:
- Integrar a Android Frame Pacing ao renderizador OpenGL
- Integrar o Android Frame Pacing ao renderizador Vulkan
Como usar o Swappy no mecanismo de jogo do Unity
O Unity integrou o Android Frame Pacing ao mecanismo. Para ativar esse recurso no Unity 2019.2 ou mais recente, marque a caixa de seleção Optimized Frame Pacing em Project Settings > Player > Settings para Android > Resolution and Presentation:

Como alternativa, ative programaticamente a opção Optimized Frame Pacing no código lógico para permitir que o Unity distribua frames de maneira uniforme e tenha menos variação na taxa de frames, criando uma jogabilidade mais suave.
Como usar o Swappy no mecanismo de jogo Unreal
O Unreal 4.25 e versões mais recentes integram a Biblioteca Android Frame Pacing, que faz parte do Android Game Development Kit. O artigo Ritmo de frames para dispositivos móveis explica como ativar a Biblioteca Android Frame Pacing e como controlar o ritmo de frames pelo código C++.
O que é o Vulkan
Vulkan é uma API moderna de gráficos 3D em várias plataformas projetada para minimizar a abstração entre o hardware gráfico do dispositivo e o seu jogo. O Vulkan é a principal API gráfica de baixo nível no Android, substituindo o OpenGL ES. O OpenGL ES ainda está disponível no Android, mas não está mais em desenvolvimento ativo de recursos.
O Vulkan oferece as seguintes vantagens sobre o OpenGL ES:
- Uma arquitetura mais eficiente com menor overhead de CPU no driver gráfico
- Novas estratégias de otimização para melhorar o desempenho da CPU
- Novos recursos gráficos não disponíveis no OpenGL ES, como APIs sem vinculação e traçamento de raio
Como usar o Vulkan em projetos Android nativos
O codelab Começar a usar o Vulkan no Android orienta você a configurar o pipeline de renderização do Vulkan e renderizar um triângulo texturizado girando na tela. Use o codelab para aprender a renderizar os gráficos do jogo.
Como usar o Vulkan no mecanismo de jogo do Unity
Para ativar a seleção automática de dispositivos no Unity, siga as etapas para configurar a API Auto Graphics.

Como alternativa, é possível ativar o Vulkan manualmente desativando a API gráfica automática e colocando o Vulkan na prioridade mais alta na lista de APIs gráficas. Se você estiver usando o Unity 2021.1 ou uma versão anterior, essa é a única maneira de usar o Vulkan.

Use o plug-in do motor VkQuality para Unity para fornecer recomendações de inicialização da API de gráficos para que seu jogo seja usado em dispositivos específicos.
Como usar o Vulkan no mecanismo de jogo Unreal
Para ativar a API gráfica Vulkan, navegue até Project Settings > Platforms > Android > Build e selecione Support Vulkan. Quando você seleciona Support Vulkan e Support OpenGL ES3.2, o Unreal usa o Vulkan por padrão. Se o dispositivo não tiver suporte ao Vulkan, o Unreal vai usar o OpenGL ES 3.2.

Se você estiver usando recursos específicos do Vulkan que se comportam mal em
determinados dispositivos, personalize o arquivo BaseDeviceProfile.ini
para excluir
esses dispositivos. Consulte Personalização de perfis de dispositivo e escalonabilidade
para Android para saber como
personalizar BaseDeviceProfile.ini
. Como novos drivers de dispositivo podem corrigir dispositivos
com problemas conhecidos, mantenha o arquivo BaseDeviceProfile.ini atualizado para receber todas
as otimizações.
O que é ADPF?
O Android Dynamic Performance Framework (ADPF) otimiza jogos com base nos recursos dinâmicos de gerenciamento de temperatura, CPU e GPU no Android. O foco é em jogos, mas você também pode usar os recursos para outros apps que exigem alta performance.
O ADPF é um conjunto de APIs que permitem que jogos e apps de alta performance interajam mais diretamente com os sistemas térmicos e de energia de dispositivos Android. Com essas APIs, você pode monitorar o comportamento dinâmico nos sistemas Android e otimizar a performance do jogo em um nível sustentável que não superaqueça os dispositivos.
Estes são os principais recursos do ADPF:
- API Thermal: monitora o estado térmico de um dispositivo para que o app possa ajustar a carga de trabalho proativamente antes que ela se torne insustentável.
- API CPU Performance Hint: fornece dicas de performance para que o Android escolha as configurações de performance corretas (por exemplo, ponto operacional ou núcleo da CPU) para a carga de trabalho.
- APIs Game Mode e Game State: ative a otimização da jogabilidade priorizando as características de desempenho ou duração da bateria com base nas configurações do usuário e específicas do jogo.
- Modo de performance fixa: ative esse modo em um dispositivo durante o benchmarking para receber medições que não são alteradas pelo relógio dinâmico da CPU.
- Modo de eficiência energética: informa à sessão que as linhas de execução na sessão de dicas de performance podem ser programadas com segurança para dar preferência à eficiência energética em vez de performance. Disponível no Android 15 (nível 35 da API).
Como usar o ADPF em projetos Android nativos
O codelab Como integrar recursos de adaptabilidade ao jogo nativo orienta você a integrar os recursos de adaptabilidade ao jogo com etapas que podem ser seguidas no seu próprio ritmo. Ao final do codelab, você vai ter integrado os seguintes recursos:
- API Thermal: ouça a condição térmica do dispositivo e reaja antes que ele entre no estado de limitação térmica.
- API Game Mode: entenda as preferências de otimização do jogador (maximizar o desempenho ou preservar a bateria) e ajuste de acordo.
- API Game State: informe ao sistema o estado do jogo (carregamento, reprodução, interface etc.) e ele poderá ajustar os recursos de acordo (aceleração de E/S, CPU, GPU etc.).
- API Performance Hint: informe ao sistema seu modelo de linha de execução e a carga de trabalho para que ele possa alocar recursos de maneira adequada.
Como usar o ADPF no mecanismo de jogo do Unity
O Adaptive Performance do Unity é uma ferramenta para desenvolvedores que querem otimizar jogos em dispositivos móveis, principalmente para o diversificado ecossistema Android. O desempenho adaptável permite que o jogo se adapte ao desempenho e às características térmicas do dispositivo em tempo real, garantindo uma experiência de jogo suave e eficiente.
O provedor de desempenho adaptativo do Android orienta você nas etapas para implementar o ADPF no Unity.

Como usar o ADPF no mecanismo de jogo Unreal

- Faça o download do plug-in.
- Copiar o plug-in para a pasta de plug-ins do projeto
- Ativar o plug-in ADPF Unreal Engine no editor do Unreal
- Reiniciar o editor do Unreal
- Criar e cozinhar o jogo
O plug-in Android Dynamic Performance Framework(ADPF, na sigla em inglês) para Unreal Engine oferece performance estável e evita a limitação térmica. Faça o download do plug-in no GitHub. Esse plug-in muda os recursos definindo valores do console Unreal.