Como posso implementar a jogabilidade em tempo real quando um usuário não está online?

5

Eu tenho duas perguntas sobre como manter temporizadores em execução (como o cultivo em Farmville) quando os usuários não estão on-line:

  • Estou certo em pensar que devo calcular o que teria acontecido quando o estado foi solicitado, em vez de executar algo a cada minuto, por exemplo?

  • Como devo manter o cliente em sincronia com o servidor? O cliente deve fazer as coisas em si e, em seguida, verificar a cada poucos minutos, ou tudo deve ser do lado do servidor em Socket.IO?

Obrigado! (desculpas se estiver na seção errada, sinta-se à vontade para movê-lo)

    
por Oliver Dunk 26.03.2016 / 23:05
fonte

3 respostas

0

Apesar de não estar relacionado a safras, na verdade eu estava lidando com um problema semelhante em que tínhamos dados que podiam ser processados após determinado tempo e esse sistema também tinha aplicativos para dispositivos móveis.

O que fizemos foi adicionar um registro de data e hora aos dados, indicando quando os dados estão prontos para a próxima etapa (seja colheita ou qualquer outra coisa).

Quando um usuário efetuava login no aplicativo, o cliente buscava dados do servidor e, com base no valor, exibia um botão para coleta ou tirava o tempo atual e o registro de data e hora do banco de dados, diferenciava os dois valores e começava a contagem. Quando o contador atingir zero, o botão de colheita será exibido.

Além disso, incluímos um cron executando a cada minuto, enviando notificações para os clientes se eles tivessem se inscrito neles quando uma cultura que não estava disponível para colheita antes se tornou assim.

Escolhemos uma tarefa cron de 60 segundos. Naturalmente, isso era bom se uma colheita se tornasse disponível em x.59, então não haveria basicamente nenhum atraso, mas se ela se tornasse disponível em x.60, o usuário não saberia até um minuto depois. Mas foi bom o suficiente para o nosso projeto e foi feito para facilitar a carga em nossos servidores.

    
por 27.03.2016 / 16:36
fonte
4

Para usar uma metáfora - o mundo (o mundo real - ou seja, o planeta Terra) deixaria de girar se de repente todos os seus "usuários" (os seres humanos e outros habitantes) morressem subitamente ou embarcassem em uma espaçonave para migrar para outro planeta? Não, claro que não! O mundo continuaria a girar até o fim do universo.

Se você está pensando em implementar uma simulação em tempo real persistente (também conhecido como "mundo"), então seu mundo também deve continuar girando / marcando independentemente de quantos habitantes (clientes / usuários) estão atualmente naquele mundo.

Como você mantém os clientes em sincronia com seu mundo é mais uma questão de quantos dados cada cliente realmente precisa e se preocupa; incluindo com que frequência você espera que os dados se tornem obsoletos e se é importante para o cliente que os dados estejam obsoletos. (Considere: se uma árvore cai em uma floresta, e não há ninguém para ouvi-la cair, ela ainda faz um som? Alguém ainda se importa que a árvore tenha caído? Schrodinger não se importa com a sua gato também).

Se você escolher um modelo de notificação, um modelo de transmissão / transmissão ou um modelo de solicitação-resposta dependerá do tipo de dados que está sendo trocado. Você provavelmente encontrará um uso para todos esses padrões de mensagens e muito mais.

Para usar a metáfora do mundo real novamente, considere quanta informação cada habitante da Terra recebe de todos os bilhões de coisas que estão acontecendo a qualquer momento.

Um "habitante" sentado em uma casa pode receber uma reportagem (um jornal) uma vez por dia, porque os jornais só mudam uma vez por dia. No entanto, quando o jornal é entregue, é um "instantâneo" bastante abrangente de todas as notícias que aconteceram ao seu redor.

Considere então que o mesmo habitante recebe notícias na TV; no entanto, o morador somente recebe esses relatórios quando a TV é ligada (e o morador decide quando ligar a TV e quando desligar novamente). A emissora sempre transmite, sem saber quem está assistindo. O habitante só observa quando eles escolhem; a transmissão não desaparece apenas porque eles desligam a TV no entanto.

Isso é análogo a ter um fluxo constante de mensagens de micro atualização transmitidas em tempo real a partir de um servidor, mas aplicativos clientes optando por ativar / desativar sua assinatura para esses fluxos de mensagens, dependendo se o cliente quer / precisa sabe na hora.

Por fim, considere o caso em que o habitante pediu que tipos específicos de atualizações de notícias fossem enviados por e-mail (talvez aqueles sobre Política e Esporte, mas não sobre Saúde ou Tecnologia); pode haver notícias pouco frequentes e imprevisíveis enviadas em horários totalmente arbitrários durante o dia; às vezes pode haver cinco histórias por hora, outras vezes pode não haver histórias por várias horas. Cada notificação é uma atualização que o habitante pediu para ser notificado porque é relevante para eles. Os relatórios sobre Saúde e Tecnologia não serão enviados para eles, mesmo quando esses relatórios forem publicados.

Geral - não há resposta certa ou errada em relação aos padrões de mensagens para sincronizar dados de cliente / servidor; diferentes tipos de dados terão requisitos diferentes e você precisa escolher o que for mais adequado.

    
por 27.03.2016 / 00:27
fonte
0

A velha abordagem que eu acho seria modelar "o que teria acontecido" no próximo pedido.

Isso é menos computacionalmente caro, pois pelo menos alguns desses usuários não farão login novamente.

No entanto, os jogos e aplicativos modernos tentam manter os usuários envolvidos enviando notificações por push "você tem mais corações / ouro", etc.

Você terá que fazer uma troca entre a despesa de executar múltiplas simulações mundiais para não usuários versus o ganho obtido atraindo usuários para jogar / gastar em seu jogo.

    
por 27.03.2016 / 16:13
fonte

Tags