Arquitetura Java do lado do servidor do MMORPG

8

Atualmente, estou fazendo um jogo MMORPG, baseado em turnos. O cliente deve executar no Android. Agora, meu amigo está fazendo os gráficos, e eu tenho feito as aulas de jogo (jogador, armamento, etc.). Agora, se a luta começar, as classes podem ser manipuladas por interfaces (na verdade, para meu parceiro, é como trabalhar com interfaces puras, ele não precisa de acesso às classes de implementação).

Agora precisamos introduzir um servidor de jogo para permitir vários jogadores. E algumas questões muito importantes surgem:

1) Devo copiar o modelo do jogo para o servidor completamente, sem deixar classes no cliente ou é melhor ter 2 cópias do modelo - 1 no servidor e 1 no dispositivo e concluir a sincronização periódica entre elas?

2) Qual método de conexão escolher entre o cliente e o servidor (o cliente à vista é o telefone Android)? Quanto ao servidor - estou me voltando para o java, porque tenho alguma experiência com ele. Mas agora a pergunta é: é melhor usar soquetes para esta tarefa ou eu posso usar serviços REST, ou até é possível conectá-lo de alguma forma ao servidor Java EE, o que é legal do meu ponto de vista, porque isso remove muita programação complicação? Mesmo que o jogo seja multiplayer, é baseado em turnos, portanto, não precisa ser renovado com muita frequência.

3) E o encadeamento? Todo cliente deve ter seu próprio segmento (no caso de soquetes)?

4) Existem livros sobre programação de jogos para servidores REAL MMORPG por aí ???

Artem Moskalev
fonte

Respostas:

7

Não copie o modelo de jogo inteiro para o servidor, você não gostaria de carregar todas as texturas e malhas detalhadas em seu servidor. Mantenha o mais simples possível, lide com todos os processos importantes, como localização, saúde, qualquer movimento, mas não carregue tudo. - NUNCA CONFIE NO CLIENTE.

Existem muitos livros, juntamente com vários wiki. Todo fornecedor de mecanismos como IdeaFrabrik, Epic Games, Exitgames, Unity (também suporta mmo's) possui uma documentação muito boa para seus produtos. A maioria dessas coisas é pública, então você tem acesso a soluções completas e pode realmente descobrir como as coisas funcionam.

A maneira mais fácil de encontrar um livro que você precisa é pesquisar o MMORPG na Amazon, depois vá para a categoria de livros e escolha a subcategoria "programação". Se você pesquisar no Google, obterá resultados indesejados ...

Aqui está a lista de livros que encontrei

Eu não entrei profundamente na programação de servidores, mas, na verdade, eu estava perto de escolher a solução de mecanismo Unity + Photon Cloud para o meu projeto MMORPG. (HeroEngine venceu) O lado do servidor é feito neste em C # e uma coisa que me lembro fortemente é a maneira como as coisas foram explicadas nos tutoriais.

Mikolaj Marcisz
fonte
Não estamos usando nenhum mecanismo, porque o jogo não exige um. Falta gráficos legais. Portanto, não precisamos do Unity com seus recursos supremos para 3D. Os livros que você forneceu parecem muito amplos - ainda não há referência ao livro que explica como escrever um servidor de alta carga para vários jogadores. Mas obrigado pelo conselho.
Artem Moskalev
Você precisa aprender sobre programação de servidor-cliente TCP. "Dizendo de maneira brutal, a programação de servidores também é usada em jogos". Você tem que aprender sua base. Isso pode ajudá-lo a começar em Java. edn.embarcadero.com/article/31995
Mikolaj Marcisz
Sim, eu sei que já =) já programei o suficiente deles em conjunto com JMS e servidores de mensagens de cadeia simples =) Foi por isso que perguntei qual é o melhor + sockets são de nível bastante baixo em comparação com o Java EE com o qual trabalhei anteriormente) Eu sei exatamente não faça como é feito com jogos multiplayer, porque até agora parece jogo-servidor programação é totalmente diferente de programação web sites ou programas de troca de mensagens simples)
Artem Moskalev
4

1) Devo copiar o modelo do jogo para o servidor completamente, sem deixar classes no cliente ou é melhor ter 2 cópias do modelo - 1 no servidor e 1 no dispositivo e concluir a sincronização periódica entre elas?

Concordou com Mikolaj não copia tudo. Envie o mínimo de dados possível. Você pode ter as mesmas classes (representando apenas o modelo de dados, não outros ativos) no cliente e no servidor, mas não as envie pela rede. Você deseja serializá-los no servidor e desserializar no cliente. O cliente deve enviar apenas comandos para o servidor.

2) Qual método de conexão escolher entre o cliente e o servidor (o cliente à vista é o telefone Android)? Quanto ao servidor - estou me voltando para o java, porque tenho alguma experiência com ele. Mas agora a pergunta é: é melhor usar soquetes para esta tarefa ou eu posso usar serviços REST, ou até é possível conectá-lo de alguma forma ao servidor Java EE, o que é legal do meu ponto de vista, porque isso remove muita programação complicação? Mesmo que o jogo seja multiplayer, ele é baseado em turnos, portanto, não precisa ser renovado com muita frequência.

Você está planejando um MMORPG baseado em turnos (não faz ideia de como isso funcionaria). Portanto, a velocidade não é um grande problema. Você pode usar qualquer tipo de serviço, o REST pode ser bom, é simples. Geralmente, os MMORPGs usam UDP (não seguro, menor, mais rápido) para coisas como atualizações de movimento em que um ou dois pacotes perdidos não importam e TCP (seguro, aéreo) para comunicação segura. A maioria dos jogos provavelmente usa algum tipo de protocolo personalizado criptografado e compactado sobre UDP e TCP para torná-lo rápido e difícil de decifrar.

3) E sobre rosqueamento? Todo cliente deve ter seu próprio segmento (no caso de soquetes)?

Normalmente você deseja ter um conjunto de encadeamentos. Cada encadeamento do pool atende a uma solicitação e depois é reciclada. Quando você não possui threads suficientes, considere bloquear ou alocar mais threads.

4) Existem livros sobre programação de jogos para servidores REAL MMORPG por aí ???

Mikolaj já pesquisou isso por você ...

MartinTeeVarga
fonte
Você poderia elaborar mais sobre o pool de threads? Se houver soquetes, o servidor estará atendendo a solicitações e alocará um novo soquete para cada um. Esses soquetes com todas as informações recebidas podem ser encapsulados como um trabalho para o encadeamento. Mas como os threads são recuperados do pool de threads, sempre que esses threads têm tarefas diferentes? + quantos soquetes abertos podem conter um servidor médio? Será mais intensivo em recursos do que o REST ou não? + no REST não há estado de sessão, portanto é difícil manter as informações do jogador. Mas descanse em java tem uma perfeita integração de servidores empresariais whch é bom
Artem Moskalev
Os livros apresentados são sobre o design de OOP do MMORPG, como parece nos comentários. Para esse ID, prefiro ficar com o GoF. Mais uma vez, parece que a programação de jogos on-line para vários jogadores do servidor é algum tipo de conhecimento sagrado passado através da geração =) Todos os fóruns / posts / livros chegam a essas idéias: "não tente programar MMO / Programar MMO é realmente difícil / MMO não é para um novato "... e nenhum conselho ...
Artem Moskalev 10/13/13
11
Veja este exemplo: tutorials.jenkov.com/java-multithreaded-servers/…
MartinTeeVarga 10/13/13 /
Os livros apresentados são sobre o design de OOP do MMORPG, como parece nos comentários. Para esse ID, prefiro ficar com o GoF. Esta frase não faz sentido. Também construir um MMORPG é equivalente a construir um avião a jato. Eu diria que ganhe suas asas com aviões de papel.
MartinTeeVarga
Você está certo 100% sobre aviões de papel =) Mas esses livros não são nem sobre aviões de papel (por aviões de papel, quero dizer a programação do lado do servidor mmo) - eu já aprendi isso com os comentários na amazon =) Alguns desses livros lidam com padrões de design para jogos MMORPG, que podem ser aprendidos com outros livros melhores, no mesmo contexto de criação de jogos. + Eu já estou construindo um B-2, então agradeço qualquer conselho que possa receber. Graças =)
Artem Moskalev