Uma sessão lenta é aquela em que mais de 25% dos frames são lentos. Um frame é lento quando não é 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.
Como medir QPS e detectar frames lentos
O comando dumpsys surfaceflinger timestats do Android fornece o QPS médio e o histograma de tempo present to present 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 desenhado. Confira as etapas para usar o comando e coletar o QPS do jogo:
Execute o comando com as flags
enableeclearpara começar a capturar informações:adb shell dumpsys SurfaceFlinger --timestats -clear -enableQuando o jogo for jogado por tempo suficiente, execute o comando novamente com a flag
dumppara despejar informações:adb shell dumpsys SurfaceFlinger --timestats -dumpAs informações despejadas fornecem o número total de frames e o histograma presentToPresent para todas as camadas renderizadas por SurfaceFlinger. É necessário encontrar a seção do jogo filtrando com base em
layerName:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833O frame rate lento da sessão pode ser calculado 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 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=0O QPS médio de cada camada também é mostrado no despejo:
... averageFPS = 30.179 ...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 por mais tempo na tela do que a meta do desenvolvedor. O jogo pode ser limitado pela CPU/GPU. Ou o dispositivo está superaquecendo e ativa um estado térmico limitado. Ou há uma incompatibilidade no frame rate do jogo e na 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 a performance 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 os jogos OpenGL e Vulkan a ter uma renderização uniforme e a 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 e o hardware de exibição de um SO. 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 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:
- Integrar a Android Frame Pacing ao renderizador OpenGL
- Integrar a 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 versões mais recentes, marque a caixa de seleção Optimized Frame Pacing em Project Settings > Player > Settings para Android > Resolution and Presentation:
Como alternativa, ative a opção Optimized Frame Pacing de maneira programática no código lógico para permitir que o Unity distribua os frames de maneira uniforme para reduzir a variação no frame rate, criando uma jogabilidade mais suave.
Como usar o Swappy no mecanismo de jogo do 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 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 nativos do Android
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 do Unity
Para ativar a seleção automática de dispositivos no Unity, siga as etapas para configurar a API Auto Graphics.
Como alternativa, você pode ativar o Vulkan manualmente desativando a API Auto Graphics, e colocando o Vulkan na maior prioridade na lista APIs Graphics. Se você estiver usando o Unity 2021.1 ou uma versão anterior, essa será a única maneira de usar o Vulkan.
Use o plug-in do mecanismo VkQuality Unity para fornecer recomendações de tempo de inicialização da API Graphics para o jogo usar em dispositivos específicos.
Como usar o Vulkan no mecanismo de jogo do Unreal
Para ativar a API Graphics do Vulkan, acesse 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 for compatível com o Vulkan, o Unreal vai usar o OpenGL ES 3.2.
Se você estiver usando recursos específicos do Vulkan que são conhecidos por se comportarem mal em determinados dispositivos, personalize o arquivo BaseDeviceProfile.ini para excluir esses dispositivos. Confira Como personalizar perfis de dispositivos e escalonabilidade
para Android para aprender a
personalizar BaseDeviceProfile.ini. Como novos drivers de dispositivos podem corrigir dispositivos ruins conhecidos anteriormente, mantenha o arquivo BaseDeviceProfile.ini atualizado para receber todas as otimizações.
O que é o 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. O foco está nos jogos, mas você também pode usar os recursos para outros apps de 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 a carga de trabalho de maneira proativa antes que ela se torne insustentável.
- API CPU Performance Hint: fornece dicas de performance que permitem que o Android escolha as configurações de performance corretas (por exemplo, ponto de operação ou núcleo da CPU) para a carga de trabalho.
- API Game Mode e API Game State: permite a otimização da jogabilidade priorizando características de performance ou duração da bateria, com base nas configurações do usuário e nas configurações específicas do jogo.
- Modo de 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 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 priorizar a eficiência energética em vez da performance. 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 jogo nativo orienta você a integrar os recursos do ADPF ao seu jogo com etapas que podem ser seguidas no seu próprio ritmo. No final do codelab, você 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 a performance ou preservar a bateria) e ajuste de acordo.
- API Game State: informe ao sistema o estado do jogo (carregamento, reprodução, interface etc.) para que ele possa ajustar os recursos de acordo (aumentar a E/S ou 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 do Unity
O Adaptive Performance do Unity é uma ferramenta para desenvolvedores de jogos que querem otimizar os jogos em dispositivos móveis, principalmente para o ecossistema Android diversificado. O Adaptive Performance permite que o jogo se adapte à performance e às características térmicas do dispositivo em tempo real, garantindo uma experiência de jogo suave e eficiente.
O provedor do Adaptive Performance Android orienta você nas etapas para implementar o ADPF no Unity.
Como usar o ADPF no mecanismo de jogo do Unreal
- Fazer o download do plug-in
- Copiar o plug-in para a pasta de plug-ins do projeto
- Ativar o plug-in do ADPF Unreal Engine no editor do Unreal
- Reiniciar o editor do Unreal
- Criar e preparar o jogo
O Framework de Performance Dinâmica do Android(ADPF) plug-in para Unreal Engine oferece desempenho estável e evita a limitação térmica. Faça o download do plug-in no GitHub (link em inglês). Esse plug-in muda os recursos definindo valores do console do Unreal.