Sessões lentas (somente jogos)

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 estão lentos. Um frame é lento quando não é apresentado menos de 50 ms depois do 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 fluência dele para os usuários.

No futuro, o Google Play vai direcionar os usuários a outras opções de jogos que não atingem 20 QPS no smartphone. O Android vitals só começa a monitorar o frame rate depois que o jogo é executado por um minuto.

Acesse nossa Central de Ajuda para mais detalhes sobre a métrica.

Gráficos de pizza que mostram o número de frames lentos e frames não lentos.
Figura 1. Uma sessão lenta no Android vitals.
.

Como medir o QPS e detectar frames lentos

O comando dumpsys surfaceflinger timestats do Android fornece QPS médio e apresentar para apresentar o histograma de tempo para todas as camadas que estão sendo renderizadas. O tempo da apresentação até a apresentação de um frame é o intervalo entre o frame atual e o frame anterior que está sendo desenhado. Confira as etapas para usar o comando e coletar os QPS do jogo:

  1. Execute o comando com as sinalizações enable e clear para começar a capturar informações:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Quando o jogo for jogado por tempo suficiente, execute o comando novamente com a sinalização dump para despejar informações:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    As informações despejadas fornecem o total de frames e o histograma "PresentToPresent" para todas as camadas renderizadas por SurfaceFlinger. Para encontrar a seção do jogo, filtre com base em layerName:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    O frame rate lento da sessão pode ser calculado com base nas informações de cada camada.

    Por exemplo, a porcentagem de frame lento de 20 QPS = (soma dos 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
    

    A média de QPS de cada camada também é mostrada no despejo:

    ...
    averageFPS = 30.179
    ...
    
  3. Depois de coletar todas as informações, desative os timestats usando a flag disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Causas e soluções de frames lentos

Há vários motivos para um frame apresentar ou renderizar por mais tempo na tela do que o destino do desenvolvedor. O jogo pode estar vinculado à CPU/GPU. Ou o dispositivo está superaquecendo e ativa um estado térmico limitado. Ou há uma incompatibilidade entre o frame rate do jogo e a 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 Android Frame Pacing, também conhecida como Swappy, faz parte das bibliotecas do AGDK. O Swappy ajuda jogos OpenGL e Vulkan a ter uma renderização uniforme e a corrigir o ritmo de frames no Android.

O ritmo de frames é a sincronização da lógica e do loop de renderização de um jogo com o subsistema e o hardware de exibição de um SO. O subsistema de exibição do Android foi projetado para evitar artefatos visuais (conhecidos como ruptura) que podem ocorrer quando o hardware de tela 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

Como usar o Swappy em projetos nativos

Consulte os guias abaixo para integrar a biblioteca Android Frame Pacing ao jogo:

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 versões mais recentes, marque a caixa de seleção "Optimized Frame Pacing" em Project Settings > Player > Settings para Android > Resolution and Presentation:

Caixa de diálogo "Configurações do projeto".
Figura 2. Ative o Frame Pacing no Unity Engine.

Como alternativa, ative de maneira programática a opção otimizada de ritmo de frames no seu código lógico para permitir que o Unity distribua frames de maneira uniforme, reduzindo a variação de frame rate, 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 Mobile Frame Pacing explica como ativar a biblioteca Android Frame Pacing e como controlar o ritmo de frames no 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 vínculo e rastreamento de raio

Como usar o Vulkan em projetos nativos do Android

O codelab Introdução ao Vulkan no Android orienta você na configuração do pipeline de renderização do Vulkan e na renderização de um triângulo texturizado e giratório na tela. Use o codelab para aprender a renderizar os elementos gráficos do seu 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.

Caixa de diálogo "Configurações do projeto".
Figura 3. Ative a API Unity Auto Graphics.

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

Caixa de diálogo "Configurações do projeto".
Figura 4. Escolha manualmente o Vulkan como a API Graphics principal no Unity.

Use o plug-in do mecanismo VkQuality Unity para fornecer recomendações de tempo de inicialização da API gráfica para seu jogo usar em dispositivos específicos.

Como usar o Vulkan no mecanismo de jogo Unreal

Para ativar a API gráfica Vulkan, acesse Project Settings > Platforms > Android > Build e selecione Support Vulkan. Quando você seleciona Suporte ao Vulkan e Suporte ao OpenGL ES3.2, o Unreal usa o Vulkan por padrão. Se o dispositivo não tiver suporte ao Vulkan, o Unreal voltará para o OpenGL ES 3.2.

Caixa de diálogo "Configurações do projeto".
Figura 5. Ative o Vulkan no Unreal Engine.

Se você estiver usando recursos específicos do Vulkan que costumam ter um mau comportamento em determinados dispositivos, personalize o arquivo BaseDeviceProfile.ini para excluir esses dispositivos. Consulte Como personalizar perfis de dispositivo e escalonabilidade para Android para aprender a personalizar BaseDeviceProfile.ini. Como novos drivers podem corrigir dispositivos inválidos anteriormente conhecidos, mantenha o arquivo BaseDeviceProfile.ini atualizado para receber todas as otimizações.

O que é o ADPF

O Android Dynamic Performance Framework (ADPF) otimiza jogos com base nos recursos dinâmicos de gerenciamento de temperatura, CPU e GPU do Android. O foco são jogos, mas você também pode usar os recursos para outros apps que exigem alto desempenho.

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 o desempenho 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: monitore o estado térmico de um dispositivo para que o app possa ajustar proativamente a carga de trabalho antes que ela se torne insustentável.
  • API CPU Performance Hint: fornece dicas de desempenho que permitem que o Android escolha as configurações corretas de desempenho (por exemplo, ponto operacional ou núcleo da CPU) para a carga de trabalho.
  • API Game Mode e Game State: para ativar a otimização do jogo, priorize 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 desempenho fixo: ative o modo de performance fixa em um dispositivo durante a comparação para receber medições que não são alteradas pelo relógio dinâmico da CPU.
  • Modo de eficiência de energia: informa à sessão que as conversas na sessão de dicas de desempenho podem ser agendadas com segurança para priorizar a eficiência energética em vez do desempenho. Disponível no Android 15 (nível 35 da API).

Como usar o ADPF em projetos nativos do Android

O codelab Como integrar recursos de adaptabilidade ao seu jogo nativo orienta você para integrar recursos do ADPF ao jogo com etapas que podem ser seguidas no seu próprio ritmo. Ao final do codelab, você terá integrado os seguintes recursos:

  • API Thermal: detecta a condição térmica do dispositivo e reage antes que ele entre no estado de limitação térmica.
  • API Game Mode: entenda as preferências de otimização dos jogadores (maximize o desempenho ou economize bateria) e faça os ajustes necessários.
  • API Game State: permite que o sistema saiba o estado do jogo (carregamento, jogo, interface etc.) para que ele possa ajustar os recursos adequadamente (aumentar E/S ou CPU, GPU etc.).
  • API Performance Hint: informe o modelo da linha de execução e a carga de trabalho para que o sistema possa alocar recursos adequadamente.

Como usar o ADPF no mecanismo de jogo do Unity.

O Desempenho adaptável do Unity é uma ferramenta para desenvolvedores que querem otimizar jogos em dispositivos móveis, principalmente para o ecossistema diversificado do 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 tranquila e eficiente.

O provedor Android de desempenho adaptativo guia as etapas para implementar o ADPF no Unity.

Caixa de diálogo "Configurações do projeto".
Figura 6. Integre o ADPF ao Unity Engine.

Como usar o ADPF no mecanismo de jogo do Unreal

Caixa de diálogo "Configurações do projeto".
Figura 7. Integre o ADPF ao Unreal Engine.
  1. Faça o download do plug-in
  2. Copie o plug-in na pasta de plug-ins do projeto.
  3. Ativar o plug-in do Unreal Engine do ADPF no editor do Unreal
  4. Reiniciar o editor do Unreal
  5. Criar e preparar o jogo

O plug-in Android Dynamic Performance Framework(ADPF) para Unreal Engine oferece desempenho estável e impede a limitação térmica. Faça o download do plug-in (em inglês) no GitHub. Este plug-in muda os recursos configurando os valores do Unreal Console.