Quais técnicas permitem que os jogos baseados na Web atualizem os recursos do jogador com frequência?

8

Há muito tempo, havia um jogo baseado na Web chamado Utopia (e tenho certeza que ainda existe), as curvas são por hora. Você só ganha ouro novo / madeira ou o que não é a cada hora.

Alguns jogos mais recentes baseados na Web têm recursos que aumentam em uma resolução mais fina, como por minuto. Digamos que um jogador tenha uma taxa de produção de alimentos de 5 por minuto - ele aumentará sua quantidade de alimentos a cada minuto. Não tenho certeza se é aconselhável definir constantemente um trabalho CRON para atualizar o banco de dados SQL, que suponho que eles estejam usando, pois é baseado na Web. Talvez eu esteja errado a cada minuto.

Quais técnicas esses jogos baseados na Web usam? Adicionado no Edit: E o banco de dados pode realmente lidar com a carga?

Extrakun
fonte

Respostas:

7

Parece-me que você pode simplesmente armazenar as taxas de produção, o nível de recurso básico e um carimbo de data / hora atualizado pela última vez. Então, sempre que você precisar conhecer o nível real de recursos, poderá multiplicar a taxa de produção pelo tempo decorrido.

Sempre que o nível real de recursos mudar - basta atualizar o nível básico. Sempre que a taxa de produção mudar, atualize o nível base para o nível real e o registro de data e hora para a hora atual.

Dessa forma, em vez de atualizar todos os jogadores (provavelmente incluindo aqueles que não estão conectados no momento) a cada minuto, você estará atualizando apenas as linhas que estão sendo usadas ativamente pelos jogadores.

(Se o seu jogo "marcar" uma vez por minuto, imagino que um "número de turno" de algum tipo seja melhor que um carimbo de data / hora real.)

Um benefício colateral desse sistema é que você pode usar a mesma lógica usada para atualizar o banco de dados e prever valores sem modificá-los - apenas enviar as informações necessárias ao cliente (em vez de atualizar uma vez por minuto) e prever valores no cliente.

Andrew Russell
fonte
3
Na verdade, isso requer algum entendimento de matemática complexa em alguns casos. Considere ganhar juros em dinheiro - adicionar juros de 1% uma vez por mês não é o mesmo que adicionar juros de 12% uma vez por ano. Segundo exemplo, se a chance de um evento ocorrer em um determinado minuto for 10%, a chance de ocorrer após 10 minutos não será 100%. Curiosamente, esta é apenas uma demonstração muito lenta dos problemas de física que as pessoas veem em outros jogos, e o mesmo método pode ser usado para resolvê-los, ie. use um timestep fixo e execute-o quantas vezes for necessário para "atualizar".
Kylotan
7
Kylotan, eu não classificaria juros compostos e múltiplas chances de probabilidade como matemática complexa. : P
O Pato Comunista
11
É um ponto válido. Mas espero que alguém implementar a produção de recursos não-linear em seus jogos entende como ele funciona;)
Andrew Russell
2
Mas eles não precisam, se estiverem usando a atualização periódica antiga. Esse é o problema que estou enfrentando - usar esse método introduz um novo erro em potencial que não era possível antes.
Kylotan
2
Você não pode usar um processo iterativo para garantir que tudo seja aplicado corretamente? Quando um jogador efetua login, ele "ativa" cada um dos recursos que são acionados em loop até que o tempo do próximo tick seja posterior ao horário atual do sistema. Talvez um pouco mais intensivo em recursos, mas deve cuidar da maioria dos sistemas não lineares.
Lunin
5

Os bancos de dados SQL modernos que são comumente usados ​​(MySQL, Postgres, Oracle, MSSQL, etc.) permitem agendar procedimentos armazenados para serem executados com intervalos de tempo arbitrários. É um método muito leve de executar atualizações como essa e elimina a necessidade de chamar scripts ou programas externos para fazer isso por você.

Isso também permite que o banco de dados otimize a consulta executada apenas uma vez, em vez de fazê-lo toda vez que um script externo a invocar, por isso é muito útil do ponto de vista de desempenho. Obviamente, isso só se aplica se suas atualizações forem triviais o suficiente para serem programadas na linguagem de script do seu banco de dados. Atualizações de recursos, logout automático de intervalo de tempo, eliminação de registros e afins são excelentes candidatos para esses procedimentos armazenados agendados.

Provavelmente, o carregamento que seu banco de dados está ocorrendo vem 99,9% de carregamentos de páginas, atualizações de mecanismos de jogos e similares, pois um jogo popular pode facilmente ter centenas de milhares de consultas por segundo. Comparado à carga resultante da execução de algumas consultas (embora as que tocam grande parte da tabela) uma vez por minuto, aproximadamente, a carga não deve ser um problema. Ou seja, a menos que você atualize os valores indexados pelo banco de dados. Evite atualizar as colunas indexadas a todo custo, se você se preocupar com o desempenho.

Fuu
fonte
2

Em relação às atualizações:

Alguns usam trabalhos CRON que atingem uma determinada página PHP de vez em quando.

Alguns usam trabalhos CRON, desta vez executando um determinado processo.

Outra abordagem é fazer atualizações 'just in time' - sempre que uma página for carregada, execute as atualizações pendentes e execute-as nesse ponto. Isso geralmente é o que você deve fazer se não conseguir executar tarefas CRON ou processos de longa execução.

Finalmente, outros estão executando o aplicativo Web inteiro como um processo, para que possam atualizar sempre que virem a hora.

O sistema final é o melhor se você tiver essa opção disponível, pois poderá armazenar os dados na memória. Atualizar alguns milhares de jogadores uma vez por minuto é trivial se você estiver apenas alterando dados na RAM, em vez de precisar gravar em um banco de dados SQL tradicional.

Mas se você não tiver esse luxo, poderá usar algum tipo de cache. Algo como memcached pode ser uma opção (dependente da sua hospedagem), que é um ponto intermediário entre a memória e um banco de dados. Você pode armazenar valores transitórios no memcache e salvá-los apenas no banco de dados quando for absolutamente necessário.

Entre o memcache e um banco de dados SQL tradicional, existem outras opções, por exemplo. as várias lojas de chave / valor ou de documentos: coisas como MongoDB , CouchDB , Amazon ou Google, etc ... ou seja. todos os sistemas sob o termo guarda-chuva NoSQL . Normalmente, eles não oferecem o poder de consulta genérico nem sempre as mesmas garantias de segurança de um banco de dados tradicional, mas geralmente são muito mais rápidos em operação. (O que não é tão surpreendente, pois eles estão fazendo menos por você.)

Mas tudo isso assumindo que um banco de dados normal não pode lidar com a carga. De fato, na maioria dos casos, provavelmente pode. Se eu tiver que emitir 10.000 chamadas UPDATE por minuto para aumentar os níveis de recursos, isso não será muito escalável quando você começar a adicionar todo o resto. Mas se você alterar isso para atualizar o recurso para todos com 1 chamada SQL, de repente as coisas parecerão muito mais positivas. Portanto, não superestime o custo de um determinado recurso, pois ele pode ser implementado de forma mais eficiente.

Kylotan
fonte
0

Sou a favor do KISS : "Seja simples, estúpido!"

Não vejo razão para que um trabalho cron não funcione, e a vantagem é que as opções baratas de hospedagem na web geralmente não permitem executar comandos diretamente, mas permitem executar comandos cron. Portanto, não há necessidade de um servidor dedicado caro.

Você também pode fazer seu código de atualização no PHP ou no idioma de sua preferência, usando o comando cron ou use o navegador de texto. As instruções em Configurando Tarefas Cron têm vários comandos de exemplo que você pode usar para executar ping em sua própria página em um intervalo.wget --spider http://yoursite.com/secretphppage.phplynx

Ricket
fonte
Acho que estou mais preocupado com um trabalho CRON que é executado a cada minuto, atualizando os dados de algumas centenas de usuários ao mesmo tempo.
Extrakun
11
Uma atualização para várias centenas de conjuntos de dados uma vez a cada minuto não é problema para um banco de dados moderno. Não sei como são suas consultas, mas uma única chamada 'UPDATE' ainda deve ter um bom desempenho, mesmo com milhares de linhas afetadas.
bummzack
E em que mundo um trabalho cron é considerado "simples"? Se você não é um administrador de sistemas, provavelmente ficará bravo só de olhar para o arquivo de configuração ...
o0 '.
O mundo dos webhosts, onde eles geralmente não oferecem acesso SSH, portanto, eles precisam fornecer uma interface fácil para o Cron. Meu serviço de hospedagem (Lunarpages) usa Cpanel, e acho que é bastante fácil de usar: img822.imageshack.us/img822/7022/easycron.png
Ricket
0

Lembro-me de dar uma olhada no código de algum clone do Planetarion. Tudo é PHP, mas o código do ticker está em C bruto - com ligações C do MySQL. Como o modelo de dados era muito simples, as atualizações acontecem muito rapidamente.

Ariejan
fonte