Consumo do PlayFab: práticas recomendadas
Com o modelo de preços baseado em consumo do PlayFab, você paga apenas pelo uso real do serviço pelos seus títulos. Mas isso levanta uma pergunta óbvia: qual é a melhor maneira de otimizar esses títulos para economizar dinheiro e, ao mesmo tempo, implementar todos os recursos de que você precisa? Neste documento, vamos nos aprofundar nesses detalhes e falar sobre práticas recomendadas que ajudarão você a planejar com antecedência. Antes de mover seus títulos do modo de desenvolvimento para o modo ao vivo, você pode revisar as informações dos medidores na guia Billing Summary do Game Manager. Há seis medidores de consumo: Events, Profile, Content and Configuration, CloudScript, Insights e Multiplayer Services. A melhor maneira de começar a otimizar um título é examinar cada um dos medidores que ele usa e ver como eles se acumulam ao longo do tempo. Isso permite identificar rapidamente algumas melhorias óbvias. Para obter mais informações sobre os medidores, consulte Medidores de preços.Eventos
Há dois tipos de eventos no PlayFab: PlayStream e telemetria. O PlayFab processa os eventos do PlayStream para verificar se eles disparam as ações do PlayStream que você definiu e para atualizar a segmentação de usuários. Alguns eventos do PlayStream são gerados automaticamente como resultado de chamadas a recursos do serviço, como autenticação e atualizações de estatísticas. Os títulos podem gerar seus próprios eventos personalizados para estender essa funcionalidade. Os eventos de telemetria não são processados pelo PlayStream. Esses eventos são usados para análise e vão diretamente para o data warehouse. Os eventos de telemetria não são gerados automaticamente no PlayFab; eles são eventos personalizados gerados pelo título. Para ambos os tipos de evento, cargas de dados maiores aumentam a quantidade total de uso do medidor. Você pode reduzir esse uso geral garantindo que está enviando apenas os dados de que precisa. Uma orientação aproximada é que qualquer evento incrementa o medidor em questão em 1 para cada 1 KB de dados no corpo do evento. Para escolher qual caminho de eventos é mais adequado ao seu uso, você deve ter um plano claro de como pretende usar cada evento personalizado que gerar. Os eventos necessários apenas para a avaliação offline do título devem seguir o caminho da telemetria. Isso pode ajudar a reduzir significativamente os custos, pois as cobranças de excedente dos eventos de telemetria são menos da metade das do PlayStream. Se você estiver usando um dos SDKs predefinidos, é importante lembrar que alguns dados de análise sobre o comportamento dos usuários são gerados automaticamente, conforme descrito na referência do modelo de eventos do PlayStream. Para desativar os eventos opcionais, altere a configuração de análise na guia Settings/Data Collection do seu jogo no PlayFab Game Manager. Da mesma forma, embora seja uma boa ideia manter a opção “generate PlayStream event” ativada para as execuções do CloudScript durante a depuração, desative-a antes de colocar o jogo no ar. No caso de CloudScripts disparados por ações do PlayStream, você sempre pode ativá-la mais tarde, se precisar depurar algum comportamento em produção.Perfil
O perfil é, na prática, “tudo sobre o jogador”, incluindo elementos comuns como inventário, dados salvos e estatísticas. Ele também contém as metainformações que você usa para oferecer experiências exclusivas por meio dos recursos de LiveOps do PlayStream, como a segmentação de usuários mencionada acima. Além disso, alguns recursos legados no nível do título, como dados de título, catálogos e lojas, estão incluídos neste medidor, pois sua implementação de dados é, na prática, igual à dos dados do usuário. Como esse conjunto de medidores é impulsionado por todas as ações dos jogadores e pelas ações executadas nos jogadores, ele é, de longe, o que mais precisa de planejamento de otimização. Os principais fatores que contribuem para o uso capturado pelos medidores de preços são a quantidade de dados lidos, armazenados e gravados e a frequência com que você chama as APIs que geram dados medidos. Para obter mais informações sobre as chamadas de API específicas que fazem esses medidores “girar”, consulte Medidores de preços. Começaremos pelos dados do usuário e pelas estatísticas, pois seus padrões de uso são semelhantes, e depois falaremos sobre o gerenciamento do inventário do jogador.Dados e estatísticas
Ao avaliar seu uso dos dados do usuário, a mesma lógica de aproximação dos eventos se aplica (cada 1 KB aumenta a contagem do medidor em 1), mas lembre-se de que cada “elemento” de uma chamada deve ser considerado distinto para fins desse cálculo. Cada par de chave-valor em uma chamada para atualizar os dados do usuário é contado separadamente. Para leituras, esse cálculo de 1 KB se aplica ao total de dados retornados, independentemente do número de pares de chave-valor. Isso significa que gravar 10 chaves de 100 bytes cada equivale a 10 “tiques” do medidor de gravação de perfil, pois cada gravação de par de chave-valor tem no mínimo 1 KB, enquanto uma leitura dessas 10 chaves equivale a 1 “tique”, pois o total é de 1 KB. Para obter detalhes mais específicos sobre os usos, consulte Medidores de preços. As estatísticas são um pouco mais complexas, pois atualizam o perfil e também podem afetar os placares. Como regra geral, você pode considerar cada estatística atualizada como uma atualização completa do perfil, enquanto as leituras se baseiam no tamanho total dos dados lidos em cada chamada. E, como o armazenamento é cobrado por gigabyte (GB) e as estatísticas normalmente consomem apenas alguns bytes cada, vamos nos concentrar nas leituras e gravações. Como o tamanho total dos dados é importante, otimizá-lo é a primeira etapa. Felizmente, há uma ampla variedade de técnicas conhecidas para isso: usar enumerações ou IDs no lugar de texto por extenso para itens, empacotar dados grandes em formato binário ou até usar campos de bits para compactar dados em espaços menores. Depois disso, a próxima etapa é avaliar cuidadosamente quando você precisa fazer essas chamadas de leitura e gravação. Se você vem do desenvolvimento para PC ou console, especialmente de jogos para um jogador, esse pode ser um padrão novo. Mas, nesses ambientes, você precisa ter cuidado com o consumo de recursos e a coleta de lixo no dispositivo cliente, pois eles podem causar degradação de desempenho em momentos críticos. Quando seu título usa recursos que estão na nuvem, é necessário estender essa lógica para considerar que cada uso de recurso tem um custo real, além de um custo de desempenho. Como determinar a frequência ideal de leituras e gravações? Duas das preocupações mais comuns dos desenvolvedores que desejam atualizar dados e estatísticas com mais frequência são a proteção contra trapaças e o armazenamento oportuno de informações no lado do servidor, seja para interações entre jogadores ou para evitar a perda de dados se o jogo for encerrado inesperadamente.Proteção contra trapaças
Embora possa parecer que você precisa atualizar constantemente os dados de back-end para garantir a segurança essencial, atualizações frequentes raramente são necessárias se o seu jogo não exigir um controle totalmente autoritativo da sessão no servidor. Para começar, a pergunta fundamental é quanta segurança você realmente precisa. Para alguns jogos, especialmente aqueles que monetizam principalmente por meio de anúncios no jogo e não têm placares, trapaças não são uma grande preocupação. Nesse caso, confiar nos dados enviados pelo cliente costuma ser uma abordagem viável, pois a segurança desses dados não é realmente uma preocupação. Para identificar comportamentos de trapaça e decidir como tratá-los, recomendamos implementar processos para revisar os eventos, os dados e as estatísticas dos seus jogadores. Para outros jogos, nos quais você precisa preservar a integridade da competição ou proteger a experiência geral dos jogadores, uma segurança mais forte é mais importante. Dependendo dos seus requisitos específicos, determinadas abordagens podem reduzir a frequência de leituras e gravações de dados nessas situações. Se o seu jogo não for em tempo real, uma abordagem que recomendamos é agregar as informações sobre o jogo do jogador durante um período (geralmente uma “rodada” do jogo, que leva vários minutos) e, em seguida, enviar esses dados a um script que determina se eles são válidos. Os elementos principais a serem avaliados podem depender do jogo, mas alguns exemplos de conceitos comuns a considerar são:- Quanto tempo se passou desde o último relatório de sessão e quanto tempo o cliente diz ter jogado na sessão mais recente?
- Quais pontuações o jogador registrou e elas são razoáveis para esse jogador, considerando seu nível, equipamento etc.?
Atualidade dos dados
Um tema comum que ouvimos entre desenvolvedores com altas taxas de gravação de perfil é a preocupação com a perda de progresso do jogador. Se o jogador sair do jogo antes que ele possa salvar e o estado local não puder ser usado na próxima vez que o jogo for jogado, ou se esse estado precisar ser transferido entre dispositivos, você vai querer que as informações de estado do jogador armazenadas no PlayFab estejam o mais atualizadas possível. Para muitos jogos, você pode resolver esse problema com uma pulsação regular e pouco frequente de atualizações para o serviço (a cada 15 minutos, por exemplo). Mas incluir uma lógica extra para aumentar ou diminuir essa frequência também pode ajudar. Por exemplo:- Inclua uma substituição de “atualização importante” que cause uma gravação imediata e redefina o temporizador se o jogador fizer ativamente algo significativo, para que isso não seja perdido.
- Se o seu jogo continuar progredindo sem a interação do jogador, considere aumentar o período de pulsação se não houver interação por muito tempo. Isso é especialmente importante em jogos idle, que os jogadores costumam deixar em execução durante a noite.
- Dê aos jogadores uma forma de forçar uma atualização diretamente, como um botão em um menu do usuário. Nesse caso, porém, limite a taxa com que as chamadas são realmente feitas do dispositivo cliente para o PlayFab, para que um jogador que pressione esse botão repetidamente não gere uma chamada a cada vez.
