Comment structurer un serveur de jeu simple pour un jeu multijoueur?


9

Je voudrais créer un serveur de jeu multijoueur simple pour un jeu simple:

Le jeu est censé être similaire à Command & Conquer, vous avez quelques chars et quelques soldats. Vous pouvez sélectionner un soldat et cliquer sur la carte, où le soldat doit aller. Si le soldat arrive dans une zone où il ne pouvait pas aller, il se promène. Et les soldats peuvent être abattus par des ennemis.

Comment dois-je structurer le serveur de jeu et que faire chez le client?

Autrement dit, si un soldat passe de X à Y mais autour du bâtiment Z, je suppose que le serveur doit être en mesure de calculer exactement où se trouve le soldat (au cas où un ennemi lui tirerait dessus), et le client doit également connaître la position de peindre le soldat.

Que faire sur le serveur et je pense que je dois concevoir un protocole pour cela. Je pense que le serveur doit garder une trace de l'état du jeu et de l'heure. Quelqu'un a-t-il des suggestions sur la façon de procéder? ou pourrait recommander une lecture?

Réponses:


12

En général, c'est un sujet très complexe. Vous avez deux objectifs contradictoires (du moins si vous ne prévoyez pas d'exécuter chaque jeu sur un serveur dédié):

  1. Vous voudrez autant que possible faire sur le serveur, à la fois pour éviter la tricherie et pour vous assurer que tous les clients voient les mêmes choses.
  2. Mais vous voulez également que les choses soient justes, ce qui signifie que si une personne a un ping 0 fois sur le serveur tandis que d'autres ont un retard de réseau, lorsque les deux émettent une commande à leurs unités en même temps, le joueur "serveur" a un avantage .

Je ne peux pas dire exactement comment résoudre ce problème pour un RTS. Ce que nous faisons pour notre tir FPS, c'est que le serveur enregistre un état mondial complet il y a quelque temps et que le client horodate chaque tir. Lorsque le message réseau pour "J'ai tiré!" atteint le serveur, le serveur peut faire reculer le monde et faire des tests de collision, etc. sur le monde "comme il cherchait le client lorsque le coup de feu a été tiré".

Si vous prévoyez d'avoir beaucoup d'unités, vous aurez également le problème d'avoir potentiellement trop de traitement pour le serveur. Si vous n'êtes pas terriblement inquiet à propos du piratage ou de la triche, je vous suggère de rechercher les clients et d'envoyer les résultats au serveur.

Encore une autre option pourrait être d'aller à la place peer2peer, laissant chaque client gérer les mises à jour pour les équipes locales, mais cela ouvre alors la question de savoir comment déterminer qui frappe quoi et ainsi de suite.

Selon la complexité de ce projet et les efforts que vous êtes prêt à y consacrer, ma meilleure suggestion serait de décider de quelque chose de préliminaire et de commencer à travailler dessus pour le tester.


1
En fait, il y a trois (ou peut-être plus) objectifs contradictoires. Le troisième est la performance, le maintien et la mise à jour de l'état d'un jeu en temps réel entièrement sur le serveur utilise beaucoup de ressources.
Bart van Heukelom

2
Oh, et vous pouvez facilement résoudre le problème n ° 2 en introduisant un décalage artificiel égal à la moyenne du décalage des autres joueurs. Eh bien, si vous pouvez appeler «rendre la situation mauvaise pour tout le monde», c'est bien.
Bart van Heukelom

@Bart: en partie vrai, mais bien sûr, il devrait y avoir un plafond sur le retard que vous introduisez artificiellement, ou des connexions plus lentes pourraient constamment forcer des connexions plus rapides à traîner trop, ce qui est certainement maintenant ce que vous voulez.
o0 '.

Trouver le meilleur chemin n'est pas un problème s'il est fait sur le client, tant qu'une fois qu'il a trouvé, il envoie la solution au serveur qui - comme pour tout mouvement - vérifie si elle est correcte.
o0 '.

2

Il existe essentiellement deux approches:

  1. Client de confiance
  2. Client non fiable

Le client de confiance est un peu plus complexe, mais présente l'avantage de pouvoir décharger une grande partie de vos calculs depuis le serveur. Le coût de fonctionnement du serveur est l'un des plus gros problèmes des jeux multijoueurs et réduira considérablement votre évolutivité.

Une bonne approche (pour les débutants) consiste à laisser chaque client des joueurs gérer ses propres unités. À l'étape suivante, vous pouvez utiliser des cycles de rechange pour permettre aux joueurs des clients de vérifier les actions des autres clients. Le serveur ne devrait pas avoir besoin de faire plus que d'échanger des messages, de maintenir la synchronisation et d'assurer la persistance (par exemple, la base de données).

Si vous prévoyez d'avoir une sorte de lobby ou de chat, alors gérez chacun de ces sujets sur un serveur supplémentaire. Cela rendra les choses beaucoup plus faciles sur la route.


Merci, c'était instructif. Je pense que j'irai pour les clients non fiables, et je dois faire le travail sur le serveur. Je n'aurai pas beaucoup de joueurs au début.
Jonas

1
"Je n'aurai pas beaucoup de joueurs ..." Je ne peux pas compter le nombre de développeurs me donnant cette ligne et revenant six semaines plus tard avec: "J'ai ces 5000 joueurs qui veulent payer pour jouer à mon jeu, mais je ne peux pas évoluer :( ". Gardez cela à l'esprit!
Andreas

9
"Client de confiance" n'est pas une approche, c'est une erreur.
o0 '.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.