Uma sessão de jogo lenta é aquela em que uma parte significativa dos frames (por exemplo, mais de 25%) não atinge o tempo para a renderização do frame desejado, como 50 ms por frame (equivalente a 20 QPS) ou 34 ms por frame (equivalente a 30 QPS). Monitorar e otimizar o desempenho do frame rate é essencial porque quadros descartados ou atrasados afetam diretamente a fluidez e a capacidade de resposta do jogo para os jogadores.
No Android, os frame rates de sessão são medidos usando dados do
SurfaceFlinger com base no intervalo de tempo entre os frames
renderizados em plataformas do jogo, incluindo OpenGL, Vulkan e kit de ferramentas de interface
do Android. Se o app usa o kit de ferramentas de interface baseado em View, em que a parte visível do app para o usuário é selecionada do
Canvas ou da hierarquia View,
consulte Renderização lenta.
Como medir QPS e detectar frames lentos
O comando dumpsys surfaceflinger timestats do Android fornece o FPS médio e o histograma de tempo present to present para todas as camadas renderizadas. O tempo present to present de um frame é o intervalo entre
o frame atual e o frame anterior sendo renderizado. Confira as etapas para usar o comando e coletar os QPS do seu 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 total de frames e o histograma presentToPresent para todas as camadas renderizadas pelo SurfaceFlinger. Para encontrar a seção do seu jogo, filtre por
layerName:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833A taxa de frames lenta da sessão pode ser calculada 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 FPS 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 para frames lentos
Há muitos motivos para um frame aparecer ou ser renderizado por mais tempo na tela do que o destino do desenvolvedor. O jogo pode estar limitado pela CPU/GPU. Ou o dispositivo está superaquecendo e ativa um estado térmico limitado. Ou há 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), 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 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 seguintes guias 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 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 "Ritmo de frame otimizado" em Configurações do projeto > Jogador > Configurações para Android > Resolução e apresentação:
Outra opção é ativar programaticamente a opção de ritmo de frames otimizado no código lógico para permitir que o Unity distribua os frames de maneira uniforme, reduzindo a variação na frame rate e criando uma jogabilidade mais fluida.
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 (link em inglês) explica como ativar a Biblioteca Android Frame Pacing e 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 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 mostra como 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 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 da 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.
Use o plug-in do mecanismo VkQuality Unity para fornecer recomendações de tempo de inicialização da API de gráficos para o jogo usar em dispositivos específicos.
Como usar o Vulkan no mecanismo de jogo Unreal
Para ativar a API Vulkan Graphics, acesse Configurações do projeto > Plataformas > Android > Build e selecione Suporte ao 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 for compatível com Vulkan, o Unreal vai usar o OpenGL ES 3.2.
Se você estiver usando recursos específicos do Vulkan que têm um comportamento ruim em determinados dispositivos, personalize o arquivo BaseDeviceProfile.ini para excluir esses dispositivos. Confira Personalizar perfis de dispositivos e escalonabilidade para Android e saiba como personalizar BaseDeviceProfile.ini. Como novos drivers de dispositivo podem corrigir dispositivos ruins conhecidos anteriormente, 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 a carga de trabalho de forma proativa antes que ela fique insustentável.
- API CPU Performance Hint: dá dicas de performance para 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: permitem a otimização da jogabilidade priorizando características de desempenho 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: 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 desempenho podem ser programadas 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 jogo nativo mostra como integrar recursos da 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: ouça a condição térmica do dispositivo e reaja antes que ele entre em 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: permite que o sistema saiba o estado do jogo (carregando, jogando, interface etc.) e ajuste os recursos de acordo (aumente a E/S ou a CPU, a GPU etc.).
- API Performance Hint: informe ao sistema o modelo de linha de execução e a carga de trabalho para que ele possa alocar recursos de acordo com isso.
Como usar a ADPF no mecanismo de jogo Unity
O Adaptive Performance da Unity é uma ferramenta para desenvolvedores de jogos que querem otimizar os games em dispositivos móveis, principalmente para o ecossistema Android, que é bastante diversificado. Com o Adaptive Performance, seu jogo se adapta 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 Adaptive Performance para Android explica as etapas para implementar o ADPF no Unity.
Como usar a ADPF no mecanismo de jogo Unreal
- Baixe o plug-in.
- Copie o plug-in para a pasta de plug-ins do projeto.
- Ativar o plug-in ADPF Unreal Engine no editor do Unreal
- Reinicie o editor do Unreal
- Crie e gere o jogo.
O plug-in Android Dynamic Performance Framework(ADPF) para Unreal Engine oferece performance estável e evita a limitação térmica. Baixe o plug-in no GitHub. Esse plug-in muda os recursos definindo valores do console do Unreal.