¿En qué tipo de tipo variable se almacena la posición del jugador en un MMORPG como WoW?


18

Incluso escuché a J. Carmack hablar rápidamente sobre eso ...

¿Cómo puede un software rastrear la posición de un jugador con tanta precisión, estando en un mundo tan grande, sin cargar entre zonas y en una escala multijugador? ¿Cómo se formatean los datos cuando pasan a través del código de red?

Puedo entender cómo se almacenan los vértices en la memoria de la tarjeta gráfica, pero cuando se trata de sincronizar el modo multijugador, no puedo imaginar qué es lo mejor.

Respuestas:


26

Scott Bilas trabajó en Dungeon Siege y escribió un artículo, "The Continuous World of Dungeon Siege" . Si bien Dungeon Siege no es un MMO, sí tiene un mundo, y habla sobre el posicionamiento del jugador en su periódico. Me pareció una gran lectura. Aquí está la sección relevante:

La cuestión de la precisión

Desde el principio, el equipo de ingeniería sabía que el mundo continuo iba a afectar significativamente el diseño del motor y el contenido, y el problema central era la estabilidad numérica. Imagina dos personajes caminando en formación a dos metros de distancia en dirección este, lejos del origen. En algún momento, la distancia entre ellos se ve abrumada por la distancia desde el origen, y los personajes parecerán estar "en el mismo lugar".

Con coma flotante, cuanto más se aleje del origen, más precisión perderá, lo que puede causar todo tipo de problemas desagradables. Las cosas no se arreglan bien, aparecen grietas entre mallas adyacentes, el espacio comienza a cuantificarse y los gatos y los perros comienzan a vivir juntos. Dungeon Siege usa la FPU en modo de precisión simple para obtener los obvios beneficios de rendimiento y para igualar la precisión nativa del hardware de video. Sin embargo, incluso si aumentamos la precisión, en última instancia, nunca podría resolver el problema porque se planeó que el mundo fuera increíblemente grande.

El problema de precisión significaba que no sería posible tener un espacio mundial coordinado unificado como la mayoría de los otros juegos. En cambio, la solución fue segmentar el mundo continuo en un conjunto de espacios de coordenadas independientes y alternar entre ellos periódicamente para restablecer la precisión. Se probaron varias ideas dentro de estas limitaciones, y finalmente nos decidimos por una variación de un sistema de portal estándar.

Nuestra solución consiste en un sistema de coordenadas basado en nodos relacionales, en el que cada fragmento de geometría (Nodo de asedio) tiene su propio espacio de coordenadas, y está vinculado espacialmente a la geometría vecina a través de las puertas que comparte en común con esos vecinos. La disposición de los nodos conectados por puertas forma un gráfico continuo que representa todo el mapa mundial. Este sistema de nodos evolucionó con el tiempo desde su objetivo original de mantener la precisión de la FPU para convertirse en el método principal de subdividir el espacio de manera eficiente y la raíz de innumerables optimizaciones.

Para encapsular el concepto de una posición 3D con respecto a un nodo específico, el vector tradicional (x, y, z) tuvo que ser aumentado con una ID de nodo (x, y, z, nodo) y representar un desplazamiento desde el origen de un nodo específico en su lugar. Esta 4-tupla está encapsulada como una Posición de Nodo de Asedio, o SiegePos. Más tarde, agregamos un SiegeRot (quaternion, nodo) para manejar las comparaciones entre orientaciones entre nodos.

La frase "no hay espacio mundial" se convirtió en un mantra para el equipo, aunque literalmente les tomó años a todos entender lo que significaba.

Puedes ver más de sus documentos sobre Dungeon Siege aquí .


¡Esa parece ser una muy buena respuesta! Gracias ! Me hubiera preguntado si el juego de hoy usaría números de extremidades como los enteros de gmp.
jokoon

3

Para un mundo enorme sin zonas, optaría por un vértice de doble precisión o un punto flotante con trozos más pequeños que dividen la tierra.

Cada fragmento tendría su propio sistema de coordenadas. Cuando cruzas el borde a cada uno de estos fragmentos, transformas todo a ese sistema de coordenadas. Así es como lo hacen en simuladores de vuelo de todos modos.

Si tienes zonas pequeñas, supongo que flotar será suficiente.


La precisión doble incurre rápidamente en enormes beneficios de rendimiento y memoria. (x, y, z, zona) es de 16 bytes; (x, y, z) los dobles serán al menos 24. No puedes hacer cálculos rápidos con ellos, y no puedes usarlos en una tarjeta gráfica.

Bueno, las tarjetas Fermi pueden usar doble precisión;) Pero sí, el enfoque fragmentado es lo que la respuesta sugiere de todos modos.
Nailer

2

Yo diría que para la ubicación real es un vector de 3 flotadores. Pero también habría un índice de zona asociado con el jugador también. (Pero no es parte de la ubicación porque todo lo que maneja ese servidor de zona está en la misma zona y, por lo tanto, no necesita estar en la misma estructura de datos).

Recuerde que hay al menos 4 zonas. Los 4 continentes principales. No creo que ninguno de esos tenga más de 10 km de lado. Por ejemplo, este blog previo a la última expansión calcula el área total de viaje como 41 millas cuadradas. Todos los campos de batalla, todas las instancias, están dentro de su propia zona y espacio de coordenadas también.

Usando la API LUA puede obtener la posición del jugador GetPlayerMapPosition () devuelve dos flotantes cada uno de 0 a 1 como una proporción a lo largo de todo el mapa mundial.


1

Para WoW, espero que usen un flotador simple x / y / z, pero en relación con una 'zona' específica

Esto ayudaría a manejar 'zonas móviles', por ejemplo, botes y zepelines


1

Por lo general, juegos en línea como Wow, Tibia, etc. Guarde la posición del jugador. usando tres variables X + Y + Z en la metatabla del jugador SQl. Runescape lo hace sin la Z, de esa manera el jugador siempre se representa en la parte superior de la malla del suelo.


¿Qué es una metatabla? Realmente dudo que lo almacene en un DB, debe usarse en tiempo real ...
jokoon

(1) La metatabla en ese caso es la tabla DB con los datos básicos de caracteres, por ejemplo. Género, posición xyz, cantidad de salud, efectivo en el banco, etc. y cualquier otra cosa que pueda haber. (2) He estado alojando servidores abiertos de Tibia, allí el jugador pos se almacena en la memoria caché del servidor. Pero ... cada 30 ~ s hay un servidor guardado en y el POS del jugador se agregará a los metadatos de los jugadores. Entonces, si el servidor se apaga / falla, la posición de los jugadores volverá a la posición de DB :)
Mikolaj Marcisz

-2

Un flotador? Bueno, una serie de 3 carrozas para un juego en 3D. Al menos para nosotros usamos pies como unidades, por lo que todo lo que necesita es 3-4 decimales para estar en el punto en que el ruido de flotación no sea un problema. Si una zona grande tiene solo una o dos millas de lado, no es tan importante. En cuanto a la zonificación transparente en los MMO, esa es una pregunta completamente diferente. En el gran esquema de problemas difíciles en un MMO, la posición de almacenamiento es bastante baja en la lista.


Tuvimos problemas de precisión de coma flotante en algunas de las grandes zonas STO durante el desarrollo. No sé qué fue de ellos. Puede que no sea la máxima prioridad, pero debe considerarse lo suficientemente temprano como para alcanzar niveles.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.