Este documento descreve como definir anotações, parâmetros de fidelidade e configurações no projeto.
Anotações e parâmetros de fidelidade
As anotações oferecem informações contextuais sobre o que o jogo está fazendo no momento que uma marcação é registrada. Os parâmetros de fidelidade refletem o desempenho e as configurações gráficas do jogo. Para defini-los, use buffers de protocolo, que são o formato neutro, estruturado e de troca de dados da linguagem do Google. Para ver mais informações sobre o uso de buffers de protocolo no jogo, consulte Sobre buffers de protocolo.
As possíveis anotações e parâmetros de fidelidade do jogo são definidas em um
arquivo chamado dev_tuningfork.proto
, localizado no diretório assets/tuningfork
do projeto. Veja a seguir um exemplo do app de demonstração:
syntax = "proto3";
package com.google.tuningfork;
enum InstrumentKey {
CPU = 0;
GPU = 1;
SWAPPY_WAIT = 2;
SWAPPY_SWAP = 3;
CHOREOGRAPHER = 4;
}
enum Level {
// 0 is not a valid value
LEVEL_INVALID = 0;
LEVEL_1 = 1;
LEVEL_2 = 2;
LEVEL_3 = 3;
};
message Annotation {
Level level = 1;
}
message FidelityParams {
int32 num_spheres = 1;
float tesselation_percent = 2;
}
Observe o seguinte:
- O pacote precisa ser
com.google.tuningfork
. - Os nomes das mensagens precisam ser exatamente
Annotation
eFidelityParams
. - Só é possível usar
enums
definidos nesse arquivo como parte de anotações. - Só é possível usar
enums
,int32s
oufloats
em camposFidelityParams
. - A ferramenta de validação aplica essas convenções.
Configurações
A mensagem Settings
é definida por tuningfork.proto
. Veja um exemplo completo no
arquivo a seguir:
gamesdk/samples/tuningfork/insightsdemo/app/src/main/assets/tuningfork/tuningfork_settings.txt
Defina as configurações do jogo em um arquivo chamado
tuningfork_settings.txt
, localizado no diretório assets/tuningfork
do
projeto. Só é necessário especificar os seguintes campos:
aggregation_strategy
: uma mensagem contendo as informações abaixo.method
:TIME_BASED
para fazer upload a cada n milissegundos ouTICK_BASED
para fazer upload a cada n marcações.intervalms_or_count
: n para o campomethod
.max_instrumentation_keys
: número de chaves de instrumentação a serem usadas. Defina como4
se estiver usando a biblioteca Android Frame Pacing.annotation_enum_size
: campo opcional, já que o tamanho é calculado na inicialização a partir do descritor.
api_key
: chave da API do projeto na nuvem do seu app, usada para validar solicitações para o endpoint. Para gerar essa chave, consulte Ativar a API. Caso note erros de conexão emlogcat
, verifique se a chave de API está correta.default_fidelity_parameters_filename
: o parâmetro de fidelidade definido, usado na inicialização (opcional se você definirtraining_fidelity_params
no código).level_annotation_index
: (opcional) índice nos campos de anotação do número de nível.
Veja a seguir um exemplo de representação de texto:
aggregation_strategy: {method: TIME_BASED, intervalms_or_count: 10000,
max_instrumentation_keys: 5, annotation_enum_size: [3,4]}
api_key: "API-KEY-FROM-GOOGLE-CLOUD-CONSOLE"
default_fidelity_parameters_filename: "dev_tuningfork_fidelityparams_3.bin"
level_annotation_index: 1
Como definir anotações
As anotações precisam ser definidas manualmente durante o jogo. É possível ver
um exemplo disso no app de demonstração, à medida que ele percorre todos os níveis do jogo
de forma automática. Para ver mais informações, consulte a função SetAnnotations()
em
insightsdemo.cpp
.
Nesse caso, a anotação especifica apenas o número do nível do jogo.
message Annotation {
Level level = 1;
}
Definir níveis de qualidade
Use os níveis de qualidade para anotar sessões para que seja possível determinar se os dispositivos estão executando o app em um nível de qualidade muito alto (o que resulta em desempenho inferior) ou muito baixo (o que resulta em fidelidade desnecessariamente reduzida).
É preciso definir pelo menos um nível de qualidade, e de preferência vários, para o
jogo. O nível de qualidade corresponde a uma instância da mensagem
FidelityParams
. Esses níveis precisam ser apresentados em ordem crescente de fidelidade, com o
seguinte formato de nome de arquivo:
dev_tuningfork_fidelityparams_i.txt
em que i
é um índice com início em 1 e com valor máximo
de 15. Esses arquivos ficam localizados no diretório assets/tuningfork
do
projeto. O projeto de amostra apresenta um exemplo dessa estrutura no
diretório
gamesdk/samples/tuningfork/insightsdemo/app/src/main/assets/tuningfork/
.
Sobre os buffers de protocolo
A biblioteca Tuning Fork usa o formato de buffer de protocolo do Google para configurações, anotações e parâmetros de fidelidade. Esse é um protocolo bem definido e em vários idiomas para dados estruturados e extensíveis. Para ver mais informações, consulte a documentação dos buffers de protocolo.
Proto2 vs. proto3
A versão do formato do buffer de protocolo é definida na primeira linha do arquivo:
syntax="proto2";
Proto2 e proto3 são duas versões de buffers de protocolo usadas com frequência. Ambas usam o mesmo formato de condutor, mas os arquivos de definição não são compatíveis. As principais diferenças entre as duas versões incluem:
- As palavras-chave
optional
erequired
não são mais permitidas no proto3. - Tudo é efetivamente
optional
no proto3. - As extensões não são compatíveis com o proto3.
Use proto3 nos arquivos .proto, já que eles podem ser compilados para C#. O Proto2 também funciona com o conjunto limitado de recursos usado na biblioteca Tuning Fork.
Texto vs. representações binárias
O formato de condutor protobuf binário é bem definido e estável em diferentes
versões do protobuf (o código gerado não é). Há também um formato de texto que
a versão completa da biblioteca protobuf pode gerar e ler. Esse formato não
é tão bem definido, mas é estável para o conjunto limitado de recursos na
biblioteca Tuning Fork. É possível fazer a conversão entre formatos binários e de texto
usando o compilador protoc
. O comando a seguir converte uma protobuf de texto em
binário:
protoc --encode com.google.tuningfork.Settings tuningfork.proto < tuningfork_settings.txt > tuningfork_settings.bin
É necessário incluir arquivos binários em vez de arquivos de texto no seu APK, porque a biblioteca protobuf completa tem vários MB de tamanho e fazer com que a biblioteca Tuning Fork dependa dela aumentaria o tamanho do jogo de forma semelhante.
Completa vs. Lite vs. Nano
Além da biblioteca protobuf completa, existe uma versão Lite, que reduz o tamanho da área ocupada
pelo código removendo alguns recursos, como reflexão, FileDescriptors
e streaming,
de formatos de texto. Nessa versão, o código ainda ocupa vários MB.
Por esse motivo, a biblioteca Tuning Fork usa a
biblioteca nanopb internamente. O código-fonte
dessa biblioteca está incluído no Android Open Source Project em external/nanopb-c
e
faz parte da ramificação gamesdk
. Use essa biblioteca no seu jogo se o tamanho do código
for um problema.
Há arquivos CMake em gamesdk/src/protobuf
que podem ajudar a integrar
todas as três versões da protobuf. As amostras usam uma combinação de nanopb e protobuf
completa.