Em que tipo de variável a posição do jogador é armazenada em um MMORPG como o WoW?

18

Eu até ouvi J. Carmack rapidamente falar sobre isso ...

Como um software pode rastrear a posição de um jogador com tanta precisão, estando em um mundo tão grande, sem carregar entre zonas e em uma escala multiplayer? Como os dados são formatados quando passam pelo código de rede?

Eu posso entender como os vértices são armazenados na memória da placa gráfica, mas quando se trata de sincronizar o multiplayer, não consigo imaginar o que é melhor.

jokoon
fonte

Respostas:

26

Scott Bilas trabalhou no Dungeon Siege e escreveu um artigo, "O mundo contínuo do Dungeon Siege" . Embora Dungeon Siege não seja um MMO, ele tem um mundo e ele fala sobre o posicionamento dos jogadores em seu artigo. Eu achei uma ótima leitura. Aqui está a seção relevante:

A questão da precisão

Desde o início, a equipe de engenharia sabia que o mundo contínuo afetaria significativamente o design do mecanismo e do conteúdo, e o principal problema era a estabilidade numérica. Imagine dois personagens andando em formação a dois metros de distância, indo para o leste, longe da origem. Em algum momento, a distância um do outro é superada pela distância da origem, e os personagens parecerão estar "no mesmo local".

Com o ponto flutuante, quanto mais você se distancia da origem, mais precisão perde, o que pode causar todo tipo de problemas desagradáveis. As coisas não estão bem, rachaduras aparecem entre malhas adjacentes, o espaço começa a se quantificar e gatos e cães começam a viver juntos. O Dungeon Siege usa a FPU no modo de precisão única para os benefícios óbvios de desempenho e para corresponder à precisão nativa do hardware de vídeo. No entanto, mesmo se aumentássemos a precisão, ele nunca conseguiria resolver o problema porque o mundo estava planejado para ser e acabou incrivelmente grande.

O problema da precisão significava que não seria possível ter um espaço de coordenadas mundial unificado como a maioria dos outros jogos. Em vez disso, a solução foi segmentar o mundo contínuo em um conjunto de espaços de coordenadas independentes e alternar entre eles periodicamente para redefinir a precisão. Várias idéias foram testadas dentro dessas restrições e, finalmente, decidimos por uma variação de um sistema de portal padrão.

Nossa solução consiste em um sistema de coordenadas relacional baseado em nó, no qual cada parte da geometria (Nó Siege) tem seu próprio espaço de coordenadas e é ligada espacialmente à geometria vizinha através das portas que compartilha em comum com esses vizinhos. A disposição dos nós conectados por portas forma um gráfico contínuo que representa o mapa do mundo inteiro. Esse sistema de nós evoluiu ao longo do tempo a partir de seu objetivo original de manter a precisão da FPU para se tornar o principal método de subdividir o espaço com eficiência e a raiz de inúmeras otimizações.

Para encapsular o conceito de uma posição 3D em relação a um nó específico, o vetor tradicional (x, y, z) teve que ser aumentado com um ID do nó (x, y, z, nó) e representar um deslocamento da origem de um nó específico. Essa tupla de 4 está encapsulada como uma posição do nó de cerco, ou SiegePos. Posteriormente, adicionamos um SiegeRot (quaternion, nó) para lidar com comparações entre orientações entre nós.

A frase “não há espaço no mundo” tornou-se um mantra para a equipe, embora literalmente demorasse anos para que todos entendessem completamente o que isso significava.

Você pode ver mais artigos dele no Dungeon Siege aqui .

Ricket
fonte
Essa parece ser uma resposta muito boa! Obrigado ! Eu teria me perguntado se o jogo de hoje usaria números limitados, como os números inteiros do gmp.
Jokoon 18/09/10
3

Para um mundo imenso sem zona, eu optaria por um vértice de precisão dupla ou ponto flutuante com pedaços menores dividindo a terra.

Cada pedaço teria seu próprio sistema de coordenadas. Quando você cruza a fronteira para cada um desses blocos, você transforma tudo para esse sistema de coordenadas. É assim que eles fazem isso nos simuladores de voo.

Se você tem pequenas zonas, acho que flutuar será suficiente.

Nailer
fonte
A precisão dupla gera rapidamente enormes benefícios de desempenho e memória. (x, y, z, zona) é de 16 bytes; (x, y, z) o dobro será de pelo menos 24. Você não pode fazer cálculos rápidos com eles e não pode usá-los em uma placa gráfica.
Bem, os cartões Fermi podem usar precisão dupla;) Mas sim, a abordagem em blocos é o que a resposta sugere de qualquer maneira.
21910
2

Eu diria que para localização real é um vetor de 3 carros alegóricos. Mas também haveria um índice de zona associado ao player. (Mas não faz parte do local, porque tudo tratado por esse servidor de zona está na mesma zona e, portanto, não precisa estar na mesma estrutura de dados.)

Lembre-se de que existem pelo menos 4 zonas. Os 4 principais continentes. Eu não acho que nenhuma delas tenha mais de 10 km de lado. Por exemplo, este blog antes da expansão mais recente calcula toda a área passível de viagem como 41 milhas quadradas. Todos os campos de batalha, todas as instâncias, estão cada um com sua própria zona e espaço de coordenadas.

Usando a API LUA, você pode obter a posição do jogador GetPlayerMapPosition () retorna dois carros alegóricos, cada um de 0 a 1 como uma proporção ao longo de todo o mapa do mundo.

Doug-W
fonte
1

Para WoW, espero que eles usem um float simples x / y / z - mas em relação a uma 'zona' específica

Isso ajudaria a lidar com 'zonas móveis', por exemplo, barcos e zepelins

bluescrn
fonte
1

Geralmente jogos online como Wow, Tibia, etc. Armazene o jogador pos. usando três variáveis ​​X + Y + Z na meta-tabela SQl player. O Runescape faz isso sem o Z - dessa forma, o jogador é sempre renderizado no topo, no topo da malha do solo.

Mikolaj Marcisz
fonte
o que é uma meta-tabela? Eu realmente duvido que ele iria armazená-lo em um DB, ele precisa ser usado em tempo real ...
jokoon
(1) A meta tabela nesse caso é a tabela DB com os dados básicos dos caracteres, por exemplo. Sexo, posição xyz, quantidade de saúde, dinheiro no banco, etc. e qualquer outra coisa que possa haver. (2) Eu tenho hospedado servidores abertos do Tibia, onde o player pos está armazenado no cache do servidor. Mas ... a cada 30 ~ s existe um servidor salvo no PDV e o PDV do jogador será adicionado aos metadados do Players. Então, se o servidor fica desligado / ele trava a posição jogadores vão voltar para a posição DB :)
Mikolaj Marcisz
-2

Um carro alegórico? Bem, uma série de 3 carros alegóricos para um jogo em 3D. Pelo menos para nós usamos pés como unidades, então tudo que você precisa é de 3 a 4 casas decimais para estar no ponto em que o ruído da bóia não é um problema. Se uma grande zona está a apenas uma milha ou duas de um lado, não é tão grande coisa. Quanto ao zoneamento transparente nos MMOs, isso é uma questão completamente diferente. No grande esquema de problemas difíceis em um MMO, a posição de armazenamento é bastante baixa na lista.

coderanger
fonte
Tivemos problemas de precisão de ponto flutuante em algumas das grandes zonas STO durante o desenvolvimento. Não sei o que aconteceu com eles. Pode não ser a principal prioridade, mas precisa ser considerada cedo o suficiente para realmente atingir níveis.