Bonjour !
Au fil des dernières mises à jour, nous avons énormément changé la manière dont fonctionnent les mouvements sur PokExp. Pas mal de bugs sont arrivés entre les différentes versions et nous allons expliquer nos évolutions techniques sur ces différentes manières de se déplacer.
Le système de map est géré avec un client (votre jeu), qui envoie des données au serveur de jeu (tournant sous node) via une technologie nommée “Socket.IO”. Cela permet de faire du temps réel et donc de voir les mouvements des autres joueurs.
Comment ça marchait en saison 2 ?
Lors de la saison 2, on avait un système très cool, mais ultra couteux en ressource. Il y avait une boucle tournant entre 30 et 60 fois par seconde, et qui récupérait les données de tous les joueurs de la map. L’envoie des mouvements au serveur était aussi géré dans cette boucle.
Le serveur renvoyé à chaque demande du client les joueurs se trouvant dans un rayon de 12 cases autour du joueur. (ce qui se trouve dans son champs de vision), permettant d’éviter d’avoir un spam de joueur.
Toutefois, ce système avait une limite énorme : le poids des données envoyé et reçu, pouvant littéralement saturer une connexion, et causer d’autres soucis (notamment des écrans noirs à cause d’une saturation de la queue de chargement de fichiers du navigateur).
Aussi, mathématiquement, les joueurs pesaient environ, sur une map à 10 joueurs, environ 1mo par seconde (ce qui est ultra élevé).
Alors, pour la saison 3, on a revu la manière dont fonctionnaient les mouvements.
La saison 3
La saison 3 introduisait un tout nouveau système de mouvement nommé “Notify” dans le code du serveur de PokExp.
L’idée du système était plutôt simple :
- Dés qu’un joueur rejoint la map, alors on lui envoie une notification avec tous les joueurs se trouvant sur la map, et on envoie une notification à ces joueurs avec les informations du nouveau joueur qui a rejoint (comprenant ainsi les skins, le pseudo etc).
- Dés qu’un joueur fait un mouvement, il envoie une notification contenant le nom de l’animation jouée et ses nouvelles coordonnées à tous les joueurs se trouvant sur la map
- Dés qu’un joueur quitte la map ou le jeu, il envoie une notification qui annonce qu’il quitte la map (et est ainsi supprimé de la map du côté des autres joueurs).
Ce système permettait de limiter énormément les données transférées entre le serveur et le client, réduisant la charge a à peine 1mo par minute. Nous avons ainsi du changer la manière dont les données étaient récupérées et éviter une boucle. Mais cela a créé un nouveau soucis. Un délai entre input (le clique sur un bouton ou une touche) et l’output (la réception des données), causant des ralentissements de mouvement, des freezes etc.
Alors, nous avons du imaginer un tout nouveau système. Un système encore plus performant et limitant les soucis.
Le nouveau système de la Saison 3.3
Le nouveau système repart du système de notification mais va encore plus loin. Nous avons réfléchi à la manière dont nous pouvions corriger les bugs présents depuis la sortie de la saison 3.
Ce système contient désormais une table de collisions adjacentes (les carrés autour du personnage), permettant de savoir si la prochaine case sera un mur ou bien de l’air / de l’eau.
Ainsi, désormais le client va détecter lui même si il va en direction d’un mur ou bien d’une case d’air. Si il détecte de l’air, il exécutera l’animation directement, et enverra une donnée de mouvement au serveur. Le serveur quant à lui, enverra une donnée au joueur contenant les prochaines collisions; et aux autres joueurs, il enverra l’animation exécutée, tout en vérifiant les collisions.
Nous avons énormément réfléchi à la manière dont nous pouvions limiter les lags, et c’est la meilleure solution que nous pouvions offrir. Nous allons aussi continuer à optimiser les mouvements dans les prochaines versions à venir pour offrir toujours une meilleure façon de jouer. Nous resterons aussi très à l’écoute des différents soucis rencontrés sur la map.
Bon jeu,
Loris