Conectar-se

Esqueci minha senha

Últimos assuntos
» Nota de esclarecimento - GMBR voltou!
Ontem à(s) 20:33 por Willy

» Regras do Fórum
Ontem à(s) 19:02 por GMBR

» Retorno da GMBR!!!
Ter 24 Jan 2017, 15:43 por GMBR

» Criando IA Simples para inimigos
Qua 25 Nov 2015, 19:22 por DJDAVYD

» Crio Trilha Sonora para Games!
Qui 27 Ago 2015, 13:50 por Isaias Malafaia

» Western Duels
Seg 24 Ago 2015, 07:47 por theguitarmester

» Dúvida sobre strings, lendo txt
Sab 22 Ago 2015, 20:31 por Pai véi

» Janela Modal
Sab 22 Ago 2015, 09:23 por Pai véi

» LudumDare #33
Sex 21 Ago 2015, 21:17 por WellingtonBecker

» GMS sempre salva projeto ao compilar?
Sex 21 Ago 2015, 12:32 por Pai véi

» Tipo de Draw que dê melhor fps...
Sex 21 Ago 2015, 12:25 por Pai véi

» Banco de Dados online fácil de configurar
Sex 21 Ago 2015, 11:47 por Pai véi

» Ficou estranho esse efeito na terra?
Qua 19 Ago 2015, 20:08 por Adriel

» Você consegue decifrar o que é isso?
Qua 19 Ago 2015, 15:48 por Mateus O de Andrade

» Texto centralizado em sprite 64x64
Qua 19 Ago 2015, 14:00 por Vandson Fernandes

» [Tutorial] Um Único Script para Todos Diálogos do Jogo
Ter 18 Ago 2015, 22:12 por dharrison

» VIDEO AULAS - Plataforma - Recriando Super Mario
Ter 18 Ago 2015, 20:44 por Adriel

» Ajuda deixar room maior
Ter 18 Ago 2015, 15:56 por Stickman

» OST - Rain From The Past (Para Main Themes)
Seg 17 Ago 2015, 23:00 por Jessezyn

» #DGM Aula 01 - Views
Seg 17 Ago 2015, 00:16 por victor13.

» Alguém sabe as dimensões de um galaxy s5?
Dom 16 Ago 2015, 20:06 por vitorfernandes13

» Conquer The Kingdom
Dom 16 Ago 2015, 12:13 por DVictorPS

» [Ajuda] Bug ds_list
Dom 16 Ago 2015, 08:27 por Witen

» câmera seguir player com touch control android
Sab 15 Ago 2015, 15:05 por Lighter

» Apk não roda no celular
Sab 15 Ago 2015, 12:10 por xLuiZzz


[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.
avatar
machosupremo

Data de inscrição : 10/10/2012
Número de Mensagens : 99
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário 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
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6034
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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 !
avatar
luan.alc

Ranking : Nota B
Notas recebidas : B
Data de inscrição : 13/03/2012
Número de Mensagens : 293
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 0
   : 0
   : 1

Ver perfil do usuário

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.
avatar
machosupremo

Data de inscrição : 10/10/2012
Número de Mensagens : 99
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário 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
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6034
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

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.
avatar
machosupremo

Data de inscrição : 10/10/2012
Número de Mensagens : 99
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ver perfil do usuário 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
Notas recebidas : C+B
Data de inscrição : 26/07/2008
Número de Mensagens : 6034
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   :
   :
   :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

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

Mensagem por Conteúdo patrocinado


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