En plus de l'article lié dans d'autres réponses, je peux parler un peu de l'expérience du projet Arianne .
Comment garder les choses synchronisées?
Nous avons construit le cadre « Marauroa » autour du concept d’actions et de perceptions: les actions sont envoyées du client au serveur portant les entrées de l’utilisateur, comme (marche à gauche, monstres d’attaque n ° 47, dites «bonjour»). Et les perceptions sont envoyées du serveur aux clients pour les informer de l’état du monde les concernant. Ces perceptions sont envoyées à chaque tour. En fonction du jeu, nous utilisons des temps de rotation de 30 ms à 300 ms.
Nous avons deux types de perceptions : une perception complète est envoyée lors de la connexion et lorsque le joueur entre dans une nouvelle zone (zone). Après cela, des perceptions différentielles sont envoyées, y compris uniquement les attributs modifiés (par exemple, la position) des objets modifiés, et bien sûr des objets nouveaux et supprimés.
Comment résoudre les problèmes de latence?
Nous croyons fermement que «le serveur a toujours raison». Le client fait certaines prédictions comme la marche en douceur, la vérification des collisions, etc. Mais si un client et le serveur ne sont pas d'accord sur quelque chose, le serveur gagne. Le sous-projet Stendhal (un RPG 2D) utilise un temps de rotation de 300 ms par défaut (avec beaucoup de lissage effectué côté client). Cela rend Stendhal très résistant au retard.
Remarque: Certains autres jeux font davantage confiance au client pour minimiser l'impact du décalage réseau. Dans WoW, il était souvent exploité dans l'un des champs de bataille appelé "Warsong Gulch". Un joueur avec le drapeau peut choisir entre deux options: au centre par un tunnel et une à droite pour monter la colline. Ainsi, un joueur tricheur court vers le tunnel, puis se retarde. Le serveur et les autres clients continueront à le voir courir vers lui. Mais après un peu de temps, ce client peut dire au serveur qu’il s’est dirigé vers la colline. WoW vérifiera que la distance entre les dernières coordonnées transmises et les coordonnées actuelles s’inscrit dans le segment temporel et l’acceptera.
Utilisation de UDP contre TCP
Dans les premières versions, nous utilisions UDP pour réduire la surcharge de TCP. Nous avons traité les paquets perdus nous-mêmes. Cela a parfaitement fonctionné aux débuts du projet. Mais lorsque le serveur a été déplacé d’une connexion DSL à la maison à un véritable centre de données, il ya plusieurs années, nous avons eu d’énormes problèmes. UDP est (ou du moins l'était il y a 5 ans) extrêmement gourmand en ressources processeur du pare-feu: le jeu de règles doit être appliqué à chaque paquet UDP. Pour TCP, toutefois, le jeu de règles ne s'applique qu'aux 3 premiers paquets. Après cela, la connexion est établie. Tous les paquets suivants contourneront le jeu de règles normal car ils sont dans la table de suivi des connexions ou parce qu’ils n’ont pas d’indicateur SYN.
Comment protéger la communication et le client du reverse engineering?
Arianne est complètement open source, cela inclut le client, le serveur, les graphiques, la musique. Et bien sûr, cela inclut notre documentation de protocole et même un analyseur utilisé pour le débogage.
Il est facile de protéger la communication contre le sniffing non autorisé par des tiers utilisant SSL.
Il est toutefois impossible de le protéger contre la rétro-ingénierie. Bien sûr, vous pouvez le masquer et utiliser des techniques anti-débogage. Mais en fin de compte, vous ne pouvez pas empêcher le reverse engineering des logiciels que vous cédez aux utilisateurs. Il y a une présentation très intéressante sur la façon dont Skype a été inversé malgré les développeurs qui ont mis beaucoup d'efforts dans les techniques anti-débogage: http://recon.cx/en/f/vskype-part1.pdf
Remarque: Il existe des pays dans lesquels l'ingénierie inverse est illégale ou qui permettent de placer un paragraphe dans la licence ou de ne pas autoriser l'ingénierie inverse. Mais il y a d'autres pays (comme celui dans lequel je vis) qui autorisent explicitement la rétro-ingénierie dans le cadre de l'élaboration de formats de stockage de données compatibles ou de protocoles de transmission, des paragraphes de la licence ou du ToS essayant de les rejeter qui sont nuls. (Tout dans cette section est à ma connaissance, je ne suis pas avocat)
Quels éléments doivent être calculés en local et lesquels sur le serveur?
Nous calculons tout ce qui concerne la logique du jeu sur le serveur. Le client prédit certains événements afin que le jeu se déroule sans heurts. Mais au final, le serveur a toujours raison.
Les événements prédits sont par exemple l’arrêt du mouvement lorsqu’une collision est touchée. Stendhal utilise une grille pour positionner les éléments. Et du point de vue du serveur, le coin supérieur gauche de chaque entité se trouve exactement sur une case. Mais le client les déplacera sans problème entre les tuiles. Il va aussi dessiner le pseudo effet 3d. Donc, une entité qui a une base de 1x1 peut être plus élevée dans le client.
Comment équilibrer les problèmes de charge?
Essayez de garder cela aussi simple que possible pour faciliter la maintenance.
L'équilibrage de la charge du contenu statique est bien connu dans le domaine des clusters de serveurs http et des réseaux de distribution de contenu.
Un concept plutôt simple d'équilibrage de la charge des services de jeu consiste à fractionner les serveurs entre régions / zones. Les zones AC sont donc sur un serveur et les zones DF sur un autre. Cela est particulièrement facile si vous ne pouvez pas regarder à partir de zones d’un jeu donné vers des zones d’un autre jeu. Vous devez y mettre quelques vérifications pour qu'un client ne puisse se connecter qu’à un serveur de zone responsable de la zone dans laquelle se trouve le lecteur.
Le moyen le plus simple de transférer des lecteurs d’un serveur à l’autre est de les écrire dans la base de données, d’indiquer au client de se connecter à l’autre serveur de zone et de les déconnecter du serveur actuel. Le client se connectera ensuite au nouveau serveur de zone qui le chargera à partir de la base de données. (Étant donné que vous avez de toute façon besoin du code de charge depuis / store vers la base de données, la communication directe entre les serveurs pour le transfert peut être mise en œuvre ultérieurement).
Certains services globaux supplémentaires sont nécessaires via: Au moment de la connexion, il est demandé aux clients de se connecter au serveur de zone approprié. Et vous voudrez peut-être un système de discussion mondial.
Je suis allé plus en détail sur ce sujet dans Comment l'équilibre des charges est-il atteint dans les MMO?