Sessões lentas

No Android vitals, 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çam 20 QPS no smartphone. O Android vitals só começa a monitorar o frame rate depois de o jogo rodar por um minuto.

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

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

Como medir QPS e detectar frames lentos

O comando dumpsys SurfaceFlinger --timestats do Android fornece o FPS médio e os histogramas de tempo de presente para presente para todas as camadas que estão sendo renderizadas. O tempo present to present de um frame é o intervalo entre o frame atual e o anterior que está sendo renderizado. Siga estas etapas para usar o comando e coletar os QPS do jogo:

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

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Quando o jogo tiver sido executado por tempo suficiente, execute o comando novamente com a flag 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 pelo SurfaceFlinger. Encontre a seção do seu jogo filtrando com base em layerName:

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

    É possível calcular a taxa de frames lentos da sessão com base nas informações de cada camada.

    Por exemplo, porcentagem de frames lentos de 20 QPS = (soma dos valores de 54 ms a 1.000 ms) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram:
    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 despejo:

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

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Causas e soluções de frames lentos

Há muitos motivos para um frame ser apresentado ou renderizado na tela por mais tempo do que o esperado. O jogo pode estar limitado pela CPU ou GPU, o dispositivo pode estar superaquecendo e ativando um estado térmico limitado ou pode haver uma incompatibilidade entre a taxa de frames do jogo e a taxa de atualização da tela do dispositivo.

Use o Android Frame Pacing (Swappy), o Vulkan e o 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 de exibição de um SO e o hardware de exibição subjacente. 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 durante uma atualização. Para evitar esses artefatos, o subsistema de exibição faz o seguinte:

  • Armazena em buffer os frames anteriores internamente.
  • Detecta envios de frames atrasados.
  • Repete a exibição de frames anteriores quando frames atrasados são detectados.

Saiba como o 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:

Como usar o Swappy no mecanismo de jogo 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 configurações do projeto > Player > Settings para Android > Resolution and Presentation:

Janela de configurações do projeto do Unity mostrando a caixa de seleção "Optimized Frame Pacing".
Figura 2. Ative a Frame Pacing no Unity Engine.

Como alternativa, ative de forma programática a opção Optimized Frame Pacing no código lógico para permitir que o Unity distribua os frames de maneira uniforme, reduzindo a variação no frame rate e 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 Sincronização de frames para dispositivos móveis explica como ativar a biblioteca Android Frame Pacing e como controlar a sincronização de frames usando o código C++.

O que é a Vulkan

Vulkan é uma API moderna de gráficos 3D multiplataforma 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 traçado de raio

Como usar o Vulkan em projetos do Android nativos

O codelab Como começar a usar o Vulkan no Android orienta você na configuração do pipeline de renderização do Vulkan e na renderização de 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 Unity

Para ativar a seleção automática de dispositivos no Unity, siga as etapas para configurar a API Auto Graphics.

Janela de configurações do projeto do Unity com a API Auto Graphics ativada.
Figura 3. Ative a API Auto Graphics do Unity.

Como alternativa, é possível ativar o Vulkan manualmente desativando a API Auto Graphics 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.

Janela de configurações do projeto do Unity com o Vulkan priorizado na lista de APIs gráficas.
Figura 4. Escolha manualmente o Vulkan como a API gráfica principal no Unity.

Use o plug-in do mecanismo VkQuality para Unity para fornecer recomendações 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 de gráficos Vulkan, acesse configurações do projeto > 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 for compatível com a Vulkan, o Unreal vai usar o OpenGL ES 3.2.

Janela de configurações do projeto do Unreal Engine mostrando a opção "Support Vulkan".
Figura 5. Ative o Vulkan no Unreal Engine.

Se você estiver usando recursos específicos da Vulkan que não funcionam bem em determinados dispositivos, personalize o arquivo BaseDeviceProfile.ini para excluir esses dispositivos. Para saber como personalizar o BaseDeviceProfile.ini, consulte Como personalizar perfis de dispositivos e escalonabilidade para Android. Como os 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 Framework de Performance Dinâmica do Android (ADPF) otimiza jogos com base nos recursos dinâmicos de gerenciamento de temperatura, CPU e GPU no Android. Os jogos são o foco, 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 de jogos 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 aplicativo possa ajustar proativamente a carga de trabalho antes que ela se torne insustentável.
  • API CPU Performance Hint: dá dicas de desempenho para que o Android escolha as configurações de desempenho corretas (por exemplo, ponto de operação ou núcleo da CPU) para a carga de trabalho.
  • API Game Mode e API Game State: otimizam a jogabilidade priorizando características de desempenho ou duração da bateria, com base nas configurações do usuário e do jogo.
  • Modo performance fixa: ativa 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 de energia: indica à sessão que as linhas de execução na sessão de dica de desempenho podem ser programadas com segurança para priorizar a eficiência de energia em vez do desempenho. Disponível no Android 15 (nível 35 da API).

Como usar o ADPF em projetos do Android nativos

O codelab Como integrar recursos de adaptabilidade ao jogo nativo orienta você na integração de recursos do ADPF ao seu jogo com etapas que você pode seguir 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 do jogador (maximizar o desempenho ou preservar a bateria) e faça os ajustes necessários.
  • API Game State: informe ao sistema o estado do jogo (carregamento, jogabilidade, interface etc.) para que ele possa ajustar os recursos de acordo (aumentar a E/S, a CPU, a GPU etc.).
  • API Performance Hint: informe ao sistema o modelo da linha de execução e a carga de trabalho para que ele possa alocar recursos de acordo.

Como usar o ADPF no mecanismo de jogo Unity

O Adaptive Performance do Unity é uma ferramenta para desenvolvedores de jogos que querem otimizar os jogos em dispositivos móveis, especialmente para o diversificado ecossistema Android. O desempenho adaptável permite que seu jogo se adapte ao desempenho e às características térmicas do dispositivo em tempo real, garantindo uma experiência de jogo tranquila e eficiente.

O provedor do Android de desempenho adaptativo orienta você nas etapas para implementar o ADPF no Unity. Consulte também Provedor do Android e desempenho adaptável do Unity do ADPF.

Janela de configurações do projeto do Unity mostrando as configurações do provedor do Android de desempenho adaptável.
Figura 6. Integrar o ADPF ao Unity Engine.

Como usar o ADPF no mecanismo de jogo Unreal

Janela de plug-ins do Unreal Engine mostrando o plug-in do Framework de Performance Dinâmica do Android.
Figura 7. Integrar o ADPF no Unreal Engine.
  1. Faça o download do plug-in.
  2. Copie o plug-in para a pasta de plug-ins do projeto.
  3. Ative o plug-in do ADPF para Unreal Engine no editor do Unreal.
  4. Reinicie o editor do Unreal.
  5. Crie e prepare o jogo.

O plug-in do Framework de Performance Dinâmica do Android (ADPF, na sigla em inglês) para o Unreal Engine oferece desempenho estável e evita o controle térmico. Baixe o plug-in no GitHub. Esse plug-in muda os recursos definindo valores do console do Unreal. Para mais detalhes, consulte o plug-in do ADPF para Unreal Engine.