QPS médio
Uma frame rate suave e estável é essencial para oferecer uma experiência de jogo de alta qualidade em dispositivos Android. Ao medir o desempenho do jogo, você precisa medir o QPS médio como um valor de referência para ter uma compreensão básica da experiência. Otimize seu jogo para atender à taxa de quadros média de 60 QPS e garantir uma ótima experiência de jogo.
QPS P90 e P99 para estabilidade
Com uma média de 60 QPS, um jogo ainda pode ter travamentos intermitentes, microengasgos e atraso de entrada imprevisível, resultando em uma experiência ruim para o jogador.
Portanto, a estabilidade do frame é tão importante quanto o rastreamento da taxa de frames média. É aqui que você deve medir as métricas de frame rate P90 e P99 como a referência consistente e o indicador de instabilidade, respectivamente. Essas métricas capturam a "parte final" da performance para que você otimize a fluidez da experiência do jogador.
Métricas
- QPS médio (referência): essa métrica fundamental fornece uma referência geral da performance do seu jogo. Embora seja um comparativo padrão, o cálculo da média significa que quedas de frames intermitentes e microtravamentos não podem ser detectados, o que o torna insuficiente para representar a experiência do jogador por si só.
- QPS P90 (valor de referência consistente no percentil de 10%): isso indica que 90% dos frames excederam esse valor de referência consistente, e apenas os 10% mais lentos levaram mais tempo para serem renderizados. Se a taxa de frames P90 for alta e próxima da média, o jogo estará funcionando bem de forma consistente para a grande maioria da sessão.
- QPS P99 (indicador de instabilidade no percentil de 1%): indica que 99% dos frames excederam esse indicador de instabilidade, isolando especificamente o 1% de frames mais lentos. Essa métrica é essencial para detectar microengasgos, atrasos no carregamento de recursos e picos repentinos de renderização pesada que causam falhas visíveis.
Exemplos
Ao comparar o QPS médio com as métricas P90 e P99, é possível diagnosticar com precisão o comportamento de um jogo.
Cenário 1: uma curva ideal (jogo otimizado)
- Média: 60 FPS (16,6 ms)
- P90: 58 FPS (17,2 ms)
- P99: 52 FPS (19,2 ms)
- Análise: as métricas estão agrupadas. O jogo parece incrivelmente fluido e consistente. Não há microtravamentos, e até mesmo o pior 1% dos frames é quase imperceptível para o olho humano.
Situação 2: gargalo de carga (vinculado à CPU/GPU)
- Média: 45 FPS (22,2 ms)
- P90: 40 FPS (25,0 ms)
- P99: 38 FPS (26,3 ms)
- Análise: a taxa de frame rate média é menor, mas de forma consistente. O P99 não cai drasticamente em comparação com a média. Isso indica que o sistema está sobrecarregado por configurações gráficas ou restrições de resolução. O jogo não vai parecer com renderização lenta, mas sim lento. Diminuir as configurações de gráficos geralmente aumenta essas métricas de maneira uniforme.
Situação 3: 60 FPS instáveis (compilação de shader / streaming de recursos travamentos)
- Média: 60 FPS (16,6 ms)
- P90: 45 QPS (22,2 ms)
- P99: 15 FPS (66,6 ms)
- Análise: esse é o pior cenário possível. Embora a taxa de frames média pareça excelente, o P99 revela um problema crítico. P99 em 66,6 ms significa que o jogo está travando completamente por vários frames de uma só vez. Isso aponta para outliers graves, geralmente causados por gargalos de CPU, atrasos no streaming de recursos (por exemplo, RAM ou armazenamento lento) ou falhas causadas pela compilação de shader.
Avaliação
Para medir de maneira eficaz o FPS médio, o P90 e o P99, use o comando dumpsys surfaceflinger timestats do Android. Essa ferramenta fornece o FPS médio e um histograma de tempo presentToPresent para todas as camadas renderizadas. O tempo presentToPresent de um frame é o intervalo entre o frame atual e o anterior sendo renderizado.
Confira as instruções detalhadas para coletar e calcular essas métricas do seu jogo:
Começar a captura: execute o comando a seguir com as flags "enable" e "clear" para começar a capturar informações:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableInformações de despejo: quando o jogo tiver sido jogado por tempo suficiente, execute o comando novamente com a flag de despejo para gerar as informações:
adb shell dumpsys SurfaceFlinger --timestats -dumpFiltrar por camada: as informações despejadas fornecem dados para todas as camadas renderizadas pelo SurfaceFlinger. Para encontrar a seção correspondente ao seu jogo, filtre com base em
layerName(por exemplo, layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Identificar o FPS médio: o FPS médio de cada camada é calculado automaticamente e mostrado diretamente na saída do despejo (por exemplo, averageFPS = 30.179).
... averageFPS = 30.179 ...Calcular QPS P90 e P99: para encontrar as métricas P90 e P99, analise o totalFrames e o histograma de tempo
presentToPresentfornecido no despejo.totalFrames = 1000 ... 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=850 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=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 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=0A. Exemplo conceitual (tabela de distribuição cumulativa): suponha que sua sessão de jogo tenha registrado uma contagem total de frames de 1.000. Para encontrar P90 e P99, calcule os limites de milissegundos em que a contagem cumulativa de frames atinge 900 frames (90%) e 990 frames (99%), respectivamente, contando do bucket de milissegundos mais baixo.
Tempo para a renderização do frame (ms) Contagem de frames (histograma) Contagem cumulativa de frames Status / cálculo de percentil 16ms 850 850 85,0% 33ms 100 950 95,0%
(A meta de P90 de 900 foi atingida! → 1000/33 = 30,3 QPS)50ms 35 985 98,5% 66ms 10 995 99,5%
(Atingimos a meta de P99 de 990! → 1000/66 = 15,1 QPS)102ms 5 1.000 100% B. Lógica de implementação (pseudocódigo) Se você estiver automatizando essa análise usando um script Python ou um analisador de registros, a lógica para extrair os valores P90 e P99 do histograma poderá ser implementada da seguinte maneira:
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundParar a captura: depois de coletar todas as informações necessárias, desative o timestats usando a flag de desativação:
adb shell dumpsys SurfaceFlinger --timestats -disable
Sessões lentas
As sessões lentas identificam problemas de desempenho generalizados no mundo real. Uma sessão é considerada "lenta" se mais de 25% dos frames ficarem abaixo de um limite (por exemplo, 20 QPS). Embora seja útil para identificar problemas críticos de build, essa métrica sozinha não garante uma experiência sustentável e de alta qualidade. Um jogo pode evitar o limite de sessão lenta, mas ainda sofrer de microtravamentos que comprometem uma experiência suave de 60 FPS.
Embora ambos sejam derivados de tempos de frame, "Sessão lenta" e "Taxa de frames" têm funções diferentes. As métricas de QPS médio, P90 e P99 medem a qualidade e a sustentabilidade do desempenho, detectando quedas instantâneas e ritmo inconsistente que a métrica de sessão lenta pode ignorar.
Conclusão
Para otimizar a performance, é preciso ter uma estratégia abrangente. Os desenvolvedores precisam usar as sessões lentas como um radar principal para detectar degradação grave de desempenho e, em seguida, examinar a média de FPS, P90 e P99 para diagnosticar as causas subjacentes e verificar a fluidez real da jogabilidade. Ao integrar essas métricas, você garante que seu aplicativo ofereça uma experiência do usuário consistentemente sustentável e excepcional.
Outros recursos
Para saber mais sobre técnicas avançadas de criação de perfis, implementação da API Frame Pacing e estratégias de otimização específicas do mecanismo, consulte a documentação oficial para desenvolvedores do Android:
- Android vitals: sessões lentas: entenda como o Google Play mede e informa períodos prolongados de renderização lenta, que afetam diretamente a experiência do usuário. Uma "sessão lenta" é definida como uma sessão do usuário em que mais de 25% dos frames são lentos (por exemplo, levam mais de 50 ms, o que equivale a 20 QPS).
- Android Developers: Optimize Game Performance (link em inglês): confira o hub central para otimização de jogos Android. Este guia abrangente aborda práticas recomendadas e ferramentas de criação de perfil (como o Android Performance Analyzer(APA) e o Perfetto) para ajudar você a maximizar o desempenho geral do jogo.