Une solution efficace pour le partage d'espace multijoueur?

10

Cette question est un peu délicate, mais je vais essayer de la clarifier.

Disons que je construis un jeu en ligne (pas à l'échelle MMO), mais qui prend en charge autant de joueurs que possible, dans une approche de serveur faisant autorité. Je veux de très grands mondes avec beaucoup d'ennemis simulés par l'IA.

Je connais quelques stratégies pour économiser le processeur du serveur en subdivisant l'espace et en ne traitant pas ce qui n'a pas besoin d'être traité. J'ai déjà divisé le monde par régions, ce qui nécessitera des temps de chargement et de petites transitions, ce qui, selon moi, est important pour maintenir la qualité du gameplay lorsque vous jouez localement (seul ou même avec quelques amis). Je ne m'attends pas à ce que les joueurs soient dans plus d'une ou deux régions.

Le problème est qu'une région peut devenir assez grande et avoir beaucoup de PNJ simulant à la fois. Comment gérer cela sans affecter l'expérience des joueurs? Des approches comme un serveur par région et similaires ne sont pas dans le tableau.

Je recherche principalement des structures de données pour contenir des hordes d'ennemis, et même des PNJ pacifiques. Pour finaliser la question, veuillez noter que les véhicules existent, donc son considérablement rapide pour voyager dans une région, influençant le "quand" pour abattre les zones.

Grimshaw
la source
Êtes-vous limité à un seul serveur physique?
Patrick Hughes
En fin de compte, non. Mais pour des raisons de simplicité et de réalisabilité, pour l'instant, je ne peux pas compliquer encore plus le projet :)
Grimshaw
Commencez simplement. Quelque chose comme WoW qui fonctionne sur plusieurs boîtiers physiques par "serveur" divise simplement leur monde en une grille et toute mise à jour est basée sur qui est dans les mêmes boîtiers que vous. Très simple, facile à modifier, fonctionne bien et vous pouvez l'utiliser avec votre seule boîte pour contrôler le traitement.
Patrick Hughes
Je suis entièrement d'accord avec votre point de vue et j'ai peut-être manqué quelque chose dans ma question. Et s'il y a un joueur à l'extrême droite de la cellule de la boîte et un autre à l'extrême gauche de la cellule voisine de droite? Ils devraient se voir! Le monde se poursuit pour un jeu comme WoW. C'est ce que je ne comprends pas, comment faire une grille mondiale continue, tout en la gardant efficace? Il y a certainement des situations où les joueurs de deux "serveurs" devraient se voir :)
Grimshaw
1
Et oui, si vous avez à la fois beaucoup de choses partout et beaucoup de joueurs partout, vous devez vraiment planifier que tout soit actif partout et tout le temps, pas de solution magique. C'est pourquoi les boîtes uniques d'un groupe de serveurs MMO ne desservent que 200 à 500 joueurs maximum ET pourquoi MMO AI pour les PNJ est pathétiquement stupide (alias bon marché à calculer).
Patrick Hughes

Réponses:

5

D'après ce que je comprends, vous aurez une sorte de physique en cours d'exécution sur votre serveur.

Si tel est le cas, il existe également d'autres techniques disponibles pour l'IA / la physique autres que le partitionnement d'espace. Du plus évident au moins évident:

  • priorité: les PNJ sans interaction directe avec les joueurs peuvent recevoir moins de temps CPU en réduisant leur taux de rafraîchissement. Vous pouvez utiliser des files d'attente prioritaires et exécuter des files d'attente avec la priorité la plus élevée de la première à la dernière, tandis que les autres files d'attente n'exécuteront que 1/2, 1/4 ou 1/8 de la file d'attente à chaque cycle. de cette façon, vous vous assurez que chaque objet s'exécute à un moment donné, mais vous réduisez le nombre de fois qu'il consomme du processeur.
  • la physique peut également être abaissée (seules les zones de collision et les sphères peuvent être utilisées en itinérance et loin de la vue).
  • simplifier l'IA / simulation en allouant des comportements très basiques aux PNJ et à l'environnement pendant que les joueurs sont loin. Habituellement, ce sera l'itinérance ou la recherche d'ennemis au lieu de la chasse, la cueillette, l'agriculture ...
  • une partie de la physique et de l'IA peut également être déléguée aux clients. Si vous manquez vraiment de CPU sur les serveurs, vous pouvez marquer l'objet comme étant partiellement résolu et les clients ajusteront la physique et la position de ces objets localement (pour éviter les PNJ flottants). Les clients peuvent avoir une certaine responsabilité dans l'exécution de l'IA (pendant le combat contre un joueur, l'appareil du joueur ciblé peut exécuter directement les PNJ attaquants)
  • pour les joueurs, la physique peut également être réduite sur le serveur et les clients recevront plus de responsabilités dans la résolution des collisions. Ex: vous frappez un objet avec votre véhicule, le serveur ne résoudra que la collision sur les boîtes de collision et marquera les objets comme potentiellement en collision. Le client enverra la résolution au serveur avec un horodatage qui l'acceptera si les objets sont balisés et que la solution semble correcte.

Une fois que vous avez mis en place ces mécanismes, vous pouvez décider combien et à quelle fréquence vous en avez besoin. La grande chose à ce sujet est que plus tard, vous pouvez ajouter quelques serveurs qui pourront prendre en charge certaines des tâches au lieu des applications clientes.

Bien sûr, la détection de collision approximative créera des aberrations, mais vous pourrez les résoudre en ajoutant de temps en temps plus de précision.

En ce qui concerne également la physique, vous devriez jeter un œil aux bibliothèques qui prennent en charge une sorte de système GPGPU comme OpenCL ou CUDA si vous avez accès à un serveur qui prend en charge l'une ou l'autre.

Coyote
la source
Combiner le partage d'espace d'une région avec des mises à jour prioritaires devrait être exactement ce dont j'ai besoin, optimal pour de petites quantités de joueurs, et toujours optimisé lorsque de nombreuses zones sont chargées. Merci.
Grimshaw
@DevilWithin Cela devrait aider et cela ne nécessite aucune modification du côté client. J'ai également ajouté quelques détails supplémentaires à la réponse.
Coyote
L'IA simplifiée est une merveilleuse idée. Bien que les PNJ soient loin des joueurs, ils n'ont pas besoin de faire autre chose que de se déplacer dans la plupart des cas. Cela signifie que je peux juste faire une approximation de ce qu'ils font, toutes les 1 minute ou quelque chose, juste pour les faire errer dans le monde .. en les imaginant comme des zombies, ils le feraient!
Grimshaw