[Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por machosupremo em Qui 05 Dez 2013, 14:24

Ola, estou abrindo esse tópico para que possamos aglomerar os conhecimentos pertinentes sobre como deveria ser a estrutura de um SERVIDOR MMO[RPG].

Também quem saber quais e como acessar o código-fonte de jogos Open Souce, fiquem a vontade para compartilhar o conhecimento.

SOBRE MIM
Encontrei dois jogos Open Source "The Mana World" e "Ryzom", porem até agora não consegui realmente acessar os códigos fontes para analisar como foi implementada o sistema e a própria comunicação. Caso eu fosse criar um jogo Online de poucas conexões simultâneas já me considero absolutamente capaz, porem já consigo identificar que minhas técnicas (código, estruturas, comunicação etc) não são otimizadas.

Por exemplo, pretendo criar um servidor em C++ (por exemplo) e o cliente em GM-Studio, porem, em exemplos simples verifiquei que a pessoa faz uma configuração de multthreads (um para cada jogador), porem isso seria a mesma abordagem em um servidor que deveria receber 100+ jogadores (eu mesmo seguiria o raciocínio).

Outro ponto seria como guardar as informações? penso eu que em um MMORPG, pode-se salvar em banco de dados a cada "pause" do jogador, por exemplo, a própria desconexão do servidor, ou como em alguns jogos quando ele troca de mapa e faz aquele "load".

CONCLUO
Espero que alguém seja capaz de compartilhar algum matéria sobre as estruturas adotadas em jogos MMO que se assemelham aos comerciais.

machosupremo

Número de Mensagens : 99
Idade : 26
Data de inscrição : 10/10/2012
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://www.dinoup.com

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por PedroX em Qui 05 Dez 2013, 18:32

Pelo que sei sobre o assunto, seria bom dividir o processamento entre servidores.

Funcionaria assim:

Servidor 1 -> interage com quem tem menor ping em relação a ele
Servidor 2 -> interage com quem tem menor ping em relação a ele
Servidor 3 -> interage com quem tem menor ping em relação a ele

Todos os servidores se comunicariam com um banco de dados que todos podem acessar.

Cada servidor se encarrega das conexões e do processamento de seus jogadores.

Um modo de salvar é quando o player parar. Por exemplo, ele está em (10, 10) e vai pra (100, 200). Quando ele chegar lá, o servidor salva a posição dele no BD.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por luan.alc em Sex 06 Dez 2013, 04:26

Assunto bastante interessante, estou com um projeto para um jogo online ! Maas, não tão complexo como MMO RPGS, e estes debates e dicas que terão aqui poderão facilitar a vida de muita gente !

Meu projeto será tipo jogo de browser, acho .. acho não tenho certeza, que pelo fato da simplicidade do jogo será bem mais fácil trabalhar com o online ! mas como não tenho experiencia vou penar bastante !

luan.alc

Ranking : Nota B
Número de Mensagens : 293
Idade : 20
Data de inscrição : 13/03/2012
Notas recebidas : B
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por machosupremo em Ter 17 Dez 2013, 21:07

Desde já agradecendo a participação do Pedrox, do Luan.alc e outros futuros.
O que busco realmente é como acessar o código fonto dos MMO(RPG's) que possuem seu código aberto. Tanto os códigos dos servidores como dos clientes são do meu interesse.

PedroX escreveu:Pelo que sei sobre o assunto, seria bom dividir o processamento entre servidores. [...].

Sobre seu ponto de vista Pedrox, acredito (porem posso estar redondamente engando) que não é viável, caso o motivo seja pela conexão do usuário com o servidor. Pois para isso deveria haver uma comunicação a mais, dos servidores com o banco de dados remoto (ja que este é compartilhado). Agora se for por motivo de sobrecarregamento do servidor, penso ser dificil com as maquinas de existem hoje em dia, apesar que depende muito da estrutura otimizada do servidor.

Mas ainda não é nem isso a minha duvida. Estarei postando ao final deste post.


luan.alc escreveu:Assunto bastante interessante, estou com um projeto para um jogo online ! [...]

Luan se for um Browser Game acredito que não precisara se preocupar tanto quanto eu, pois os jogadores não precisarão de dados em tempo real, isto é, sera atualizado a cada requisição par ao servidor (entrar no site, atualizar a pagina, fazer uma ação etc). Se o jogador ficar com a página parada por 1h sem fazer absolutamente nada, este não estará "pesando o servidor" (ainda sim tera uma conexão aberta pendente, mas não estará requisitando nenhum tipo de dado).


O QUE PROCURO

Retomei meu projeto do PokeDota este fim de semana (estou mexendo nele quando tenho um tempo sobrando na casa da namorada). Pegando meu projeto como exemplo. Como não fiz um servidor a parte (estou usando o próprio GM), então para facilitar a programação:
*Existe um servidor principal, do qual fornece os dados dos jogadores e colocam todos em um mesmo ambiente para escolher um jogo aberto (semelhante o Gunbound, quando esta fora de alguma sala);
*Alguem cria uma sala no jogo, que é exibida para todos online;
*Quando o dono da sala (que no caso esta armazenada no server principal) clica em iniciar a partida, este líder da sala vira um servidor, e os jogadores se desconectam (ou não, ñ me lembro agora) do servidor principal e se conecta à ele;
*Quando o jogo termina,todos retomam a conexão com o servidor principal, e o dono da partida automaticamente envia todos os dados relevantes da partida.


Entenderam?! Diferente do Dota 2, que "hosteia" todas as partidas, e qualquer um pode cair e retomar o jogo sem problemas. Mas como fazer isso? Como programar para que tenha essa divisão de recurso para todas as partidas mais os jogadores dentro delas.

Outra questão é sobre a movimentação dos personagens e/ou NPC's. Estou apenas enviando um codigo para identificar a ação de movimento por exemplo, e junto com as coordenadas final. Mas e se o computador de alguem dar lag?! provavelmente quem esta se movimentando vai chegar mais atrasado no PC dele que no resto dos participantes. [Solução: Enviar as coordenadas atuais (então se estiver diferente o objeto da um pulo pra correta, e as coordenadas finais]

Mas e na questão dos creeps?! Devo também ficar enviando um código de movimento de cada um?! Quem conhece o jogo sabe que pode armazenar aprox. 60+ creeps/minions/tropas facilmente.

QUEM TIVER FAZENDO ALGUM PROJETO SOBRE COMUNICAÇÃO SERVIDOR/CLIENTE PODE ME PEDIR AJUDA QUE SE ESTIVER AO MEU ALCANCE VOU AJUDAR.

machosupremo

Número de Mensagens : 99
Idade : 26
Data de inscrição : 10/10/2012
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://www.dinoup.com

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por PedroX em Ter 17 Dez 2013, 22:42

*Existe um servidor principal, do qual fornece os dados dos jogadores e colocam todos em um mesmo ambiente para escolher um jogo aberto (semelhante o Gunbound, quando esta fora de alguma sala);
*Alguem cria uma sala no jogo, que é exibida para todos online;
*Quando o dono da sala (que no caso esta armazenada no server principal) clica em iniciar a partida, este líder da sala vira um servidor, e os jogadores se desconectam (ou não, ñ me lembro agora) do servidor principal e se conecta à ele;
*Quando o jogo termina,todos retomam a conexão com o servidor principal, e o dono da partida automaticamente envia todos os dados relevantes da partida.
Basicamente a minha ideia era essa. Só que em vez do jogador escolher o servidor que ele quer, o próprio jogo escolhe aquele que tem menor ping em relação ao jogador.

Como programar para que tenha essa divisão de recurso para todas as partidas mais os jogadores dentro delas.
Pra mim não ficou claro.

Outra questão é sobre a movimentação dos personagens e/ou NPC's. Estou apenas enviando um codigo para identificar a ação de movimento por exemplo, e junto com as coordenadas final. Mas e se o computador de alguem dar lag?! provavelmente quem esta se movimentando vai chegar mais atrasado no PC dele que no resto dos participantes. [Solução: Enviar as coordenadas atuais (então se estiver diferente o objeto da um pulo pra correta, e as coordenadas finais]
Para evitar lags, baseie-se no FPS.

Exemplo:

Código:
speed = 5 * room_speed / fps;

Se a room_speed é 30 mas o FPS está em 15, a velocidade passa a ser 10.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por machosupremo em Qua 18 Dez 2013, 16:11

PedroX escreveu:
*Existe um servidor principal, do qual fornece os dados dos jogadores e colocam todos em um mesmo ambiente para escolher um jogo aberto (semelhante o Gunbound, quando esta fora de alguma sala);
*Alguem cria uma sala no jogo, que é exibida para todos online;
*Quando o dono da sala (que no caso esta armazenada no server principal) clica em iniciar a partida, este líder da sala vira um servidor, e os jogadores se desconectam (ou não, ñ me lembro agora) do servidor principal e se conecta à ele;
*Quando o jogo termina,todos retomam a conexão com o servidor principal, e o dono da partida automaticamente envia todos os dados relevantes da partida.
Basicamente a minha ideia era essa. Só que em vez do jogador escolher o servidor que ele quer, o próprio jogo escolhe aquele que tem menor ping em relação ao jogador.

PedroX escreveu:
Como programar para que tenha essa divisão de recurso para todas as partidas mais os jogadores dentro delas.
Pra mim não ficou claro.

Pedro, você provavelmente já compreende como seria o fluxograma, mas estou postando para outros.
Imagem Fluxograma:

Cada carinha feliz representa um jogador, exceto aqueles conectados às partidas que significa 10 jogadores (por isso do vezes 10).
O quadrado verde é o objeto (no sistema do server) da Partida. E a caixa Preta é o próprio servidor.

Estudando sobre fazer um servidor em C++ para trabalhar com GM, o cara criava um objeto com sua thread independente (definia uma nova) para cada conexão nova. Penso não ser necessário quando os jogadores estiverem esperando por um jogo.

Porem ai, o próprio objeto é responsável por receber sua própria "conexão" (recebe os dados relevantes a si mesmo). Mas quando eu for criar uma partida essa partida, então agora vai ser criada com um thread individual, e ela vai receber todos as informações dos objetos dos jogadores participantes (talvez armazenar as informações no objeto partida e deletar os jogadores?! não sei ao certo).

Quando houver alguma ação dos jogadores na partida, somente o objeto partida vai receber/processar/retornar para os mesmos.

Gostaria de saber se esta certo o meu pensamento e/ou se ha uma forma de otimização.


Código:
speed = 5 * room_speed / fps;

//Se a room_speed é 30 mas o FPS está em 15, a velocidade passa a ser 10.

Cara valeu heim, eu realmente nem havia dado atenção à questão de utilizar o próprio FPS para resolver. Brigadão =]

Macho SupreMO escreveu:VOLTO A PERGUNTAR SE ALGUÉM SABE/DESCOBRIU COMO ACESSAR O CÓDIGO FONTE DE JOGOS OPEN SOURCE

Sei do "Ryzom" e o " The Mana World". Penso que talvez tenham acesso ao do "Tibia" (este previsto para ser open source, mas nunca aconteceu).

Tentei procurar nos sites dos jogos, mas realmente não achei o local.

machosupremo

Número de Mensagens : 99
Idade : 26
Data de inscrição : 10/10/2012
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://www.dinoup.com

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por PedroX em Qua 18 Dez 2013, 17:29

Quando participei num projeto como programador da parte online, eu tive que usar algo parecido. Era um projeto de futebol, mas tinha a opção de conectar no servidor que você quisesse numa lista.

Programei assim:

- Ao rodar um servidor (criar uma partida), este enviava seu IP para uma página PHP, que o escrevia num arquivo de texto. O contrário também (fechar o servidor e apagar da lista).
- Quando o jogador entrava, o jogo baixava o arquivo de texto que tinha todos os IPs possíveis de escolher.

Isso elimina (ou diminui) a necessidade de um servidor central dedicado. Só que o servidor precisa ser baixado por quem irá hostear.

Mas se você quer um único servidor, então você pode usar um objeto para cada partida mesmo. Num ds_map você pode guardar o id do jogador (key) e o id da instância do objeto partida (value).

Ao receber uma mensagem, pega o id, e procura no mapa o id. Então é só repassar tudo para essa instância.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Estrutura SERVIDOR] Como deve ser um SERVIDOR MMO

Mensagem por Conteúdo patrocinado Hoje à(s) 08:08


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum