Dans quel type de type de variable la position du joueur est-elle stockée sur un MMORPG tel que WoW?

18

J'ai même entendu J. Carmack en parler rapidement ...

Comment un logiciel peut-il suivre la position d'un joueur avec autant de précision, dans un monde aussi vaste, sans chargement entre les zones et à une échelle multijoueur? Comment les données sont-elles formatées lorsqu'elles passent par le netcode?

Je peux comprendre comment les sommets sont stockés dans la mémoire de la carte graphique, mais quand il s'agit de synchroniser le multijoueur, je ne peux pas imaginer ce qui est le mieux.

jokoon
la source

Réponses:

26

Scott Bilas a travaillé sur Dungeon Siege et a écrit un article, "The Continuous World of Dungeon Siege" . Bien que Dungeon Siege ne soit pas un MMO, il a un monde et il parle du positionnement des joueurs dans son journal. J'ai trouvé que c'était une excellente lecture. Voici la section pertinente:

Le problème de la précision

Dès le début, l'équipe d'ingénierie savait que le monde continu allait affecter de manière significative le moteur et la conception du contenu, et le principal problème était la stabilité numérique. Imaginez deux personnages marchant en formation à deux mètres l'un de l'autre en direction est loin de l'origine. À un certain point, la distance les uns par rapport aux autres est dépassée par la distance par rapport à l'origine, et les caractères semblent être «au même endroit».

Avec la virgule flottante, plus vous vous éloignez de l'origine, plus vous perdez de précision, ce qui peut provoquer toutes sortes de problèmes désagréables. Les choses ne se passent pas bien, des fissures apparaissent entre les mailles adjacentes, l'espace commence à se quantifier et les chats et les chiens commencent à vivre ensemble. Dungeon Siege utilise le FPU en mode simple précision pour les avantages évidents en termes de performances et pour correspondre à la précision native du matériel vidéo. Cependant, même si nous augmentions la précision, cela ne pourrait finalement pas résoudre le problème parce que le monde était prévu et a fini par être incroyablement grand.

Le problème de précision signifiait qu'il ne serait pas possible d'avoir un espace de coordonnées mondial unifié comme la plupart des autres jeux. Au lieu de cela, la solution consistait à segmenter le monde continu en un ensemble d'espaces de coordonnées indépendants et à basculer entre eux périodiquement pour réinitialiser la précision. Diverses idées ont été testées dans ces limites, et nous avons finalement opté pour une variante d'un système de portail standard.

Notre solution consiste en un système de coordonnées basé sur des nœuds relationnels, dans lequel chaque bloc de géométrie (nœud de siège) a son propre espace de coordonnées, et est lié spatialement à la géométrie voisine via les portes qu'il partage en commun avec ces voisins. La disposition des nœuds reliés par des portes forme un graphique continu qui représente la carte du monde entière. Ce système de nœuds a évolué au fil du temps à partir de son objectif initial de maintenir la précision des FPU pour devenir la principale méthode de subdivision efficace de l'espace et la racine d'innombrables optimisations.

Afin d'encapsuler le concept d'une position 3D par rapport à un nœud spécifique, le vecteur traditionnel (x, y, z) devait être complété par un ID de nœud (x, y, z, nœud) et représenter un décalage par rapport à l'origine d'un nœud spécifique à la place. Ce tuple 4 est encapsulé en tant que position de nœud de siège ou SiegePos. Plus tard, nous avons ajouté un SiegeRot (quaternion, nœud) afin de gérer les comparaisons entre les orientations à travers les nœuds.

L'expression «il n'y a pas d'espace mondial» est devenue un mantra pour l'équipe, même s'il a fallu des années à tout le monde pour comprendre ce que cela signifiait.

Vous pouvez voir plus de ses articles sur Dungeon Siege ici .

Ricket
la source
Cela semble être une réponse très loufoque! Merci ! Je me serais demandé si le jeu d'aujourd'hui utiliserait des nombres limités comme le font les entiers de gmp.
jokoon
3

Pour un monde immense sans zone, je choisirais soit un sommet à double précision, soit une virgule flottante avec de plus petits morceaux divisant la terre.

Chaque morceau aurait son propre système de coordonnées. Lorsque vous traversez la frontière pour chacun de ces morceaux, vous transformiez tout en ce système de coordonnées. C'est comme ça qu'ils font dans les sims de vol de toute façon.

Si vous avez de petites zones, je suppose que float sera suffisant.

Cloueur
la source
La double précision engendre rapidement d'énormes avantages en termes de performances et de mémoire. (x, y, z, zone) est de 16 octets; (x, y, z) les doubles seront au moins 24. Vous ne pouvez pas faire de calculs rapides sur eux et vous ne pouvez pas les utiliser sur une carte graphique.
Eh bien, les cartes Fermi peuvent utiliser une double précision;) Mais oui, l'approche fragmentée est ce que la réponse suggère de toute façon.
Nailer
2

Je dirais qu'un emplacement réel est un vecteur de 3 flotteurs. Mais il y aurait également un index de zone associé au joueur. (Mais ne fait pas partie de l'emplacement car tout ce qui est géré par ce serveur de zone est dans la même zone et n'a donc pas besoin d'être dans la même structure de données.)

N'oubliez pas qu'il y a au moins 4 zones. Les 4 grands continents. Je ne pense pas que l'un d'entre eux soit à plus de 10 km d'un côté. Par exemple, ce blog avant la dernière extension calcule la totalité de la zone de voyage comme 41 miles carrés. Tous les champs de bataille, toutes les instances, se trouvent chacun dans leur propre zone et coordonnent également l'espace.

En utilisant l'API LUA, vous pouvez obtenir la position du joueur GetPlayerMapPosition () renvoie deux flottants chacun de 0 à 1 en proportion sur toute la carte du monde.

Doug-W
la source
1

Pour WoW, je m'attends à ce qu'ils utilisent un flottant simple x / y / z - mais par rapport à une «zone» spécifique

Cela aiderait à gérer les «zones en mouvement», par exemple les bateaux et les zeppelins

bluescrn
la source
1

Habituellement, les jeux en ligne tels que Wow, Tibia etc. Stockez le joueur pos. en utilisant trois variables X + Y + Z dans la méta-table du lecteur SQl. Runescape le fait sans le Z - de cette façon, le joueur est toujours rendu en haut en haut du maillage au sol.

Mikolaj Marcisz
la source
qu'est-ce qu'une méta-table? Je doute vraiment qu'il le stocke dans une base de données, il doit être utilisé en temps réel ...
jokoon
(1) La méta-table dans ce cas est la table DB avec les données de caractères de base, par exemple. Sexe, position xyz, montant de la santé, espèces en banque, etc. et tout ce qui pourrait exister. (2) J'ai hébergé des serveurs Tibia ouverts, là où le joueur pos est stocké dans le cache du serveur. Mais ... toutes les 30 ~ s il y a une sauvegarde de serveur sur le et le POS du joueur sera ajouté aux métadonnées des joueurs. Donc, si le serveur s'arrête / il plante, la position des joueurs reviendra à la position DB :)
Mikolaj Marcisz
-2

Un flotteur? Eh bien, un tableau de 3 flotteurs pour un jeu 3D. Au moins pour nous, nous utilisons les pieds comme unités, donc tout ce dont vous avez besoin est de 3-4 décimales pour être au point où le bruit de flottement n'est pas un problème. Si une grande zone n'est qu'à un mile ou deux d'un côté, ce n'est pas si grave. Quant au zonage transparent dans les MMO, c'est une toute autre question. Dans le grand schéma des problèmes difficiles dans un MMO, la position de stockage est assez faible sur la liste.

coderanger
la source
Nous avons eu des problèmes de précision en virgule flottante dans certaines des grandes zones STO pendant le développement. Je ne sais pas ce qu'ils sont devenus. Ce n'est peut-être pas la priorité absolue, mais il doit être pris en compte suffisamment tôt pour faire des niveaux.