Visão geral do Android Performance Tuner (nativo)

Este tópico descreve como integrar o Android Performance Tuner, também conhecido como biblioteca Tuning Fork, para registrar e fazer upload de dados de tempo para a renderização do frame em mecanismos de jogos nativos (C e C++).

Para o mecanismo de jogos do Unity, consulte o guia do Unity.

Contexto

Um componente essencial da experiência do jogo é o desempenho de renderização. O desempenho de renderização é um resultado das duas seguintes entradas:

  • Frame rate: a frequência com que um frame é desenhado.
  • Configurações de qualidade gráfica: nível de fidelidade com que um frame é apresentado, incluindo fidelidade de simulação e gráficos.

Para jogos, um bom desempenho de renderização é definido da seguinte forma:

  • Apresentação de um frame rate consistente e estável (ou seja, o percentual de frames renderizados na frequência esperada).
  • Renderização de frames com a maior frequência possível, mantendo a estabilidade, normalmente de 30 ou 60 QPS, dependendo do tipo de jogo.
  • Maximização do nível de detalhes para um usuário de acordo com o tamanho e a densidade da tela, sem deixar de alcançar um frame rate esperado e estável.

A biblioteca Android Frame Pacing limita grande parte da variação nos tempos para a renderização de frames, proporcionando um frame rate estável para os jogos. O restante da variação nos tempos para a renderização se deve ao nível de detalhes exibido em algumas cenas do jogo e aos recursos gráficos do dispositivo. Com o Android Performance Tuner, é possível identificar os momentos do jogo em que o tempo para a renderização do frame fica mais lento ou mais rápido que o pretendido e relacionar esses problemas e oportunidades a:

  • Determinadas configurações de qualidade
  • Cenas específica no jogo
  • Determinados modelos ou especificações de dispositivo

Registrar e fazer upload de dados

A biblioteca Tuning Fork usa uma das funções de marcação chamadas para cada frame pela biblioteca Android Frame Pacing. Dentro da biblioteca, essas informações de marcação são agregadas a histogramas, que são periodicamente enviados ao Google Play por um endpoint HTTP. Cada marcação é registrada como associada a uma chave de instrumento e a uma anotação, e as definições são especificadas em um arquivo de buffer de protocolo.

Chaves de instrumento

Uma chave de instrumento indica o local do frame de onde a marcação é originada. A chave é um número inteiro que precisa ser transmitido para cada chamada de função da marcação. A biblioteca Android Frame Pacing usa um conjunto predefinido de chaves de instrumento, especificadas em swappy_common.h. Também é possível definir suas próprias chaves de instrumento, caso você não use a biblioteca Frame Pacing.

Anotações

As anotações oferecem informações contextuais sobre o que o jogo está fazendo no momento que uma marcação é registrada. Por exemplo, uma anotação pode identificar qualquer um dos seguintes elementos:

  • O nível atual do jogo
  • Um "chefão" na tela
  • Outras informações relevantes sobre o estado do jogo

As anotações são definidas pela mensagem de buffer de protocolo com.google.tuningfork.Annotation. Para definir a anotação atual, transmita uma serialização da mensagem definida para TuningFork_setCurrentAnnotation(). Todos os dados de marcação subsequentes serão associados a essa anotação até que outra anotação seja definida. Veja a seguir um exemplo de definição de proto para anotações:

import "tuningfork.proto"
enum Level {
  INVALID_LEVEL = 0;
  Level_1 = 1;
  Level_2 = 2;
  Level_3 = 3;
}
message Annotation {
  optional Level level = 1;
}

Parâmetros de fidelidade

Os parâmetros de fidelidade influenciam o desempenho e a fidelidade gráfica do jogo, como nível de detalhe da malha, resolução da textura e método anti-aliasing. Assim como as anotações, os parâmetros de fidelidade são definidos usando a mensagem de buffer de protocolo com.google.tuningfork.FidelityParams. Veja a seguir um exemplo de definição de .proto para parâmetros de fidelidade:

import "tuningfork.proto"
message FidelityParams {
  int32 texture_quality_level = 1;
  int32 shadow_resolution = 2;
  float terrain_details_percent = 3;
  int32 post_processing_effects_level = 4;
}

Na inicialização do Tuning Fork, transmita uma serialização dos parâmetros usados pelo jogo. Você poderá mudar esses parâmetros se, por exemplo, o usuário mudar as configurações de renderização do jogo, e os dados enviados por upload subsequentes estiverem associados aos novos parâmetros.

Para que o Google Play compreenda as anotações e os parâmetros de fidelidade definidos, o arquivo de buffer de protocolo que contém essas definições precisa ser agrupado no APK do jogo, junto com as configurações de inicialização. Também é preciso fornecer valores padrão para combinações comuns de parâmetros de fidelidade no APK para que os dados sejam segmentados por eles na IU do Google Play. Para ver mais informações, consulte Definir níveis de qualidade.

Sobrecarga de memória e CPU

Toda a memória usada pela biblioteca Tuning Fork é alocada na inicialização para evitar surpresas durante o jogo. O tamanho dos dados depende do número de chaves de instrumento, do número de possíveis anotações e do número de buckets em cada histograma. O tamanho resulta da multiplicação de todos esses elementos vezes quatro bytes para cada bucket. Existem também duas cópias de todos os histogramas para permitir o envio em buffer duplo.

O envio ocorre em outra linha de execução e não bloqueia as chamadas de marcação. Se não houver uma conexão de upload disponível, o envio será colocado na fila para upload posterior.

Há pouca sobrecarga de processamento para chamar uma função de marcação: apenas um índice na matriz de buckets de histograma é calculado e uma contagem de números inteiros é incrementada.

Integrar a biblioteca Tuning Fork

Este guia de integração é dividido em duas partes. Na primeira parte, descrevemos como executar um teste completo usando um app de demonstração e o Google Play Console. A segunda parte descreve como integrar a biblioteca Tuning Fork ao seu conjunto de ferramentas e como usar as funções que a biblioteca oferece. Clique no link Próximo abaixo para começar.