Armazenando coordenadas de cada objeto no lado do servidor nos MMOs

12

Em um MMORPG:

É típico ou viável armazenar as coordenadas de todas as árvores, arbustos, etc. no lado do servidor para detecção de colisão?

Em caso afirmativo, qual seria uma maneira viável de armazenar um número tão grande de coordenadas (estruturas de dados e manipulação de problemas de desempenho)?

Caso contrário, esse tipo de detecção de colisão é feito inteiramente no lado do cliente, com o servidor não verificando?

Ou existe um meio termo, com o cliente verificando a colisão e o servidor verificando? Nesse caso, como o servidor verificaria o mesmo sem manter as coordenadas no servidor também?

Sajith Dilshan Jamal
fonte
2
Não sei o suficiente sobre isso para dar uma boa resposta, mas se você detectar detecção de colisão apenas no lado do cliente, os trapaceiros encontrarão uma maneira de contornar tudo ou obter upgrades que estão a quilômetros de distância deles.
Peethor 29/03/16
2
-1 "A pergunta não mostra nenhum esforço de pesquisa".
Vaillancourt
na verdade, provavelmente não é uma duplicata, eu aprendi sobre sistemas espaciais de partição e estruturas de dados espaciais que a outra questão não tiveram
Sajith Dilshan Jamal

Respostas:

15

Independentemente da viabilidade (sim, dependendo da escala), muitas vezes existem maneiras melhores ou mais fáceis.

Por exemplo, no seu MMO típico, o servidor realmente precisa apenas conhecer o mapa de navegação aproximado usado pela IA e pela busca de caminhos do jogador. Em vez de armazenar o local de uma árvore, você pode apenas fazer um furo no mapa de navegação no local da árvore. O mesmo acontece com outros grandes obstáculos.

Mesmo jogos que precisam de uma detecção mais profunda de colisões, você pode dividi-lo em uma detecção no servidor e no cliente. O servidor pode se preocupar apenas com caminhos grosseiros, enquanto o cliente lida com uma detecção de colisão mais sensível à animação. Por exemplo, um jogador ferido tenta rastejar ao longo de uma grande rocha para encontrar um esconderijo dos inimigos. O servidor determina que um jogador podia se mover ao longo da borda da rocha (o servidor não tem idéia de que não é uma pedra, só que há um caminho, o jogador pode levar ao lado de uma área unpathable), enquanto o cliente sabe que a rocha está presente e reproduz uma animação do personagem se apoiando na rocha enquanto ela caminha. Observe que o cliente não está se movendoo personagem ou jogabilidade impactante de qualquer forma neste caso; está apenas reagindo aos objetos próximos com uma animação.

Você certamente pode armazenar um grande número de objetos no servidor. Não é diferente de qualquer jogo de mundo aberto. Use um bom esquema de particionamento espacial e mantenha a área de memória de seus objetos o mais leve possível. Observe que podemos ter diferentes versões de "grandes números" em nossas cabeças: se você quis dizer que queria armazenar cada pedregulho ou pedra no jogo como um objeto separado, isso é bobo, mesmo para um jogo para um jogador . :)

Sean Middleditch
fonte
7

Sim - é viável. Os MMOs geralmente dividem o mundo do jogo em várias áreas, pois isso facilita o trabalho, mas você ainda pode fazê-lo com uma área enorme - basta usar um bom esquema de particionamento espacial.

Como a maioria dos objetos nos MMOs não se move, você também pode executar um passo de pré-processamento em que os objetos são usados ​​para criar árvores de verificação de colisão.

A pegada de memória não é um grande problema aqui, desde que você use o instanciamento. Armazenar alguns carros alegóricos por objeto não é nada no grande esquema das coisas. Atualmente, um PC modesto terá 4 gigabytes, enquanto o armazenamento de uma posição é de apenas 3 carros alegóricos (ou 3 duplos) - o que permitiria facilmente vários milhões de objetos armazenados no jogo.

Armazenar coisas como inventários para cada jogador, sem dúvida, ocuparia mais dados - embora isso possa ser facilmente armazenado em cache no disco e carregado apenas quando um jogador fizer login.

Você deseja fazer redundantemente a verificação de colisão no cliente e no servidor, pois isso permitirá que o cliente reaja de maneira mais responsiva ao ambiente. Se um jogador se chocar contra uma parede, você deseja que ele pare de se mover imediatamente - não depois de meio segundo quando o servidor responder.

Você também deseja usar o servidor para fins oficiais. Por exemplo, você executaria a busca de caminhos apenas no cliente, pois não pode trapacear seguindo um caminho menos eficiente!

Causeless
fonte
obrigado pela dica sobre esquemas de particionamento espacial, eu aprendi algo novo
Sajith Dilshan Jamal 30/03