Stockage des coordonnées de chaque objet côté serveur dans les MMO

12

Dans un MMORPG:

Est-il typique ou faisable de stocker les coordonnées de chaque arbre, rocher de brousse, etc. du côté serveur pour la détection de collision?

Dans l'affirmative, quelle serait une façon possible de stocker un si grand nombre de coordonnées (structures de données et autres, gestion des problèmes de performances)?

Sinon, ce type de détection de collision se fait-il entièrement côté client, le serveur ne vérifiant pas du tout?

Ou existe-t-il un terrain d'entente, avec le client vérifiant la collision et le serveur vérifiant? Si oui, comment le serveur vérifierait-il la même chose sans conserver les coordonnées dans le serveur également?

Sajith Dilshan Jamal
la source
2
Je n'en sais pas assez à ce sujet pour donner une bonne réponse, mais si vous ne détectez les collisions que du côté client, les tricheurs trouveront un moyen de tout couper ou de ramasser des bonus qui sont à des kilomètres d'eux.
Peethor
2
-1 "La question ne montre aucun effort de recherche".
Vaillancourt
en fait, probablement pas un doublon, j'ai appris des schémas de partition spatiale et des structures de données spatiales que l'autre question n'avait pas
Sajith Dilshan Jamal

Réponses:

15

Indépendamment de la faisabilité (oui, selon l'échelle), il existe souvent des moyens meilleurs ou plus faciles.

Par exemple, dans votre MMO typique, le serveur n'a vraiment besoin que de connaître la carte de navigation grossière utilisée par l'IA et le cheminement des joueurs. Au lieu de stocker l'emplacement d'un arbre, vous pouvez simplement découper un trou dans la carte de navigation à l'emplacement de l'arbre. De même pour tout autre gros obstacle.

Même les jeux qui nécessitent une détection plus approfondie des collisions, vous pouvez souvent la décomposer en détection côté serveur et côté client. Le serveur peut simplement se préoccuper du cheminement grossier tandis que le client gère la détection de collision plus sensible à l'animation. Par exemple, un joueur blessé essaie de ramper le long d'un gros rocher pour trouver une cachette aux ennemis. Le serveur détermine qu'un joueur peut se déplacer le long du bord de la roche (le serveur n'a aucune idée qu'il y est un rocher, juste qu'il ya un chemin que le joueur peut prendre à côté d'une zone unpathable) alors que le client sait que la roche est présente et joue une animation du personnage s’appuyant contre le rocher en marchant. Notez que le client ne bouge pasle personnage ou le gameplay impactant de quelque manière que ce soit dans ce cas; il réagit simplement aux objets voisins avec une animation.

Vous pouvez certainement stocker un grand nombre d'objets sur le serveur. Ce n'est pas différent de n'importe quel jeu en monde ouvert. Utilisez un bon schéma de partitionnement spatial et gardez l'empreinte mémoire de vos objets aussi légère que possible. Notez que nous pouvons avoir différentes versions de "grands nombres" dans nos têtes ici: si vous vouliez dire que vous vouliez stocker chaque petit caillou ou bosse rocheuse dans le jeu en tant qu'objet séparé, alors c'est juste idiot, même pour un jeu solo . :)

Sean Middleditch
la source
7

Oui - c'est faisable. Les MMO divisent souvent le monde du jeu en plusieurs zones, car cela facilite le travail, mais vous pouvez toujours le faire avec 1 zone massive - il vous suffit d'utiliser un bon schéma de partitionnement spatial.

Étant donné que la plupart des objets dans les MMO ne bougent pas, vous pouvez également effectuer une passe de prétraitement où les objets sont utilisés pour créer des arbres de vérification des collisions.

L'empreinte mémoire n'est pas un gros problème ici tant que vous utilisez l'instanciation. Stocker quelques flotteurs par objet n'est rien dans le grand schéma des choses. Un PC modeste aura de nos jours 4 gigaoctets, tandis que le stockage d'une position n'est que de 3 flotteurs (ou 3 doubles) - ce qui permettrait facilement plusieurs millions d'objets stockés dans le jeu.

Stocker des choses comme des inventaires pour chaque joueur prendrait sans aucun doute plus de données - bien que cela puisse facilement être mis en cache sur le disque et uniquement chargé lorsqu'un joueur se connecte.

Vous voudrez effectuer la vérification des collisions de manière redondante sur le client ainsi que sur le serveur, car cela permettra au client de réagir de manière plus réactive à l'environnement. Si un joueur entre dans un mur, vous voulez qu'il cesse de bouger immédiatement - pas après une demi-seconde lorsque le serveur répond.

Vous ne souhaitez également utiliser le serveur que pour des choses faisant autorité. Par exemple, vous effectueriez la recherche de chemin uniquement sur le client, car vous ne pouvez pas tricher en prenant un chemin moins efficace!

Sans cause
la source
merci pour le conseil sur les schémas de partition spatiale, j'ai appris quelque chose de nouveau
Sajith Dilshan Jamal