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 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.

Gráficos semelhantes a gráficos 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 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:

  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 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
    ...
    
  3. 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:

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:

Caixa de diálogo "Project settings".
Figura 2. Ative o Frame Pacing no Unity Engine.

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.

Caixa de diálogo de configurações do projeto.
Figura 3. Ative a API Unity 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.

Caixa de diálogo "Project settings".
Figura 4. Escolha manualmente o Vulkan como a API gráfica principal no Unity.

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.

Caixa de diálogo "Project settings".
Figura 5. Ative o Vulkan no Unreal Engine.

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.

Caixa de diálogo de configurações do projeto.
Figura 6. Integrar o ADPF no Unity Engine.

Como usar o ADPF no mecanismo de jogo Unreal

Caixa de diálogo de configurações do projeto.
Figura 7. Integrar o ADPF no Unreal Engine.
  1. Faça o download do plug-in.
  2. Copiar o plug-in para a pasta de plug-ins do projeto
  3. Ativar o plug-in ADPF Unreal Engine no editor do Unreal
  4. Reiniciar o editor do Unreal
  5. 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.