Europa Universalis IV - Carnet de développement du 31 Octobre

Bonjour à tous. Nous sommes de retour avec un autre carnet de dev. Comme mentionné la semaine dernière, nous avons travaillé sur quelque chose en coulisses. En un mot, nous avons mis une tonne de travail sur le mode multijoueur, pour s'attaquer à des problèmes de longue date tels que le Hotjoin et le Cross-platform. De nombreux utilisateurs ont relevé des problèmes avec ces fonctions qui ne fonctionnent pas bien, ou même pas du tout ! Comme la semaine dernière, je vais remettre le micro à l'homme responsable de la majeure partie du travail, @Alexivan

Salut. Je voudrais commencer en disant que le support multijoueur pour nos jeux n'est pas une tâche facile, et parfois nous pensons que ce serait plus facile de couper cette fonctionnalité. Mais voir des gens passer du bon temps ensemble nous pousse à continuer de le soutenir, sans oublier que nous aimons nous aussi jouer dans notre MultiPlayer du Dev Clash.

EU4 est complexe en ce qui concerne le multijoueur car il a la plus grande quantité de configurations multijoueur parmi nos jeux, les facteurs étant:
  • Platform
  • DLC activés
  • Hotjoin / rejoindre quand c chaud
  • Date de départ/sauvegardes
  • Custom nations
  • Monde aléatoire
  • Nouveau Monde Aléatoire
Jusqu'à présent, nos efforts se sont concentrés sur l'hébergement du jeu en 1444 et la poursuite d'une partie sauvegardée. Au cours de cette mise à jour, nous avons toutefois déployé plus d'efforts pour que le MP fonctionne dans toutes les configurations, dans l'ordre de priorité de la liste. J'aimerais partager quelques idées sur certains des problèmes que nous avons rencontrés et sur les méthodes que nous utilisons.

Lorsque nous avons commencé à travailler sur le MP pour la prochaine mise à jour 1.23 Persia, l'objectif était de faire fonctionner le Hotjoin à nouveau. Le Hotjoin copie l'état actuel du jeu chez le joueur nouvellement connecté, ce qui en théorie est une chose assez simple à faire. Il y a deux parties des données du jeu qui doivent être synchronisées: toutes les données qui sont sauvegardées dans le « gamestate », et toutes les données qui ne le sont pas. Nous appellerons ces catégories persistantes et mises en cache.

En commençant par les données persistantes, nous avons remarqué que les sauvegardes n'étaient pas sauvegardées au fur et à mesure de leur lecture, ce qui signifie que nous modifions la sauvegarde en la lisant et en l'écrivant. Bien que cela fonctionne pour la configuration standard car tout le monde applique les mêmes changements quand ils chargent tous le jeu, le Hotjoin se désynchronise car seuls les hotjoiners effectuent les changements.

Nous avons ajouté une commande de console appelée check_save pour nous aider à trouver ce problème, c'est une commande de console qui sauvegarde le jeu, le charge et l'enregistre de nouveau. Cela nous a aidés à trouver la plupart des problèmes liés à l'incohérence de la sauvegarde. La plupart des problèmes proviennent du chargement du jeu lors de la lecture de la sauvegarde, donc la lecture d'un gouvernement de pays pourrait par exemple appliquer certains modificateurs ou réinitialiser certaines variables. Sinon, la plupart du temps, les variables n'étaient pas écrites / lues correctement.

Pour les données en cache, nous devions faire quelques choses. Nous avons d'abord ajouté une étape de recalcul, qui se produit lorsque vous chargez une sauvegarde ou qu’un hotjoineur entre dans le jeu, cette étape recalcule toutes les données mises en cache. Une grande partie des données de cette étape a été dérivée des données persistantes, ce qui a bien fonctionné. Certaines dépendaient toutefois d'autres données mises en cache, ce qui permettait de recalculer les choses différemment. Nous avons résolu ce problème en déplaçant toutes les valeurs mises en cache dans un conteneur séparé afin de pouvoir effacer toutes les données mises en cache avant de les calculer.

Un autre problème avec les données persistantes était l'ordre de chargement. Il y a deux problèmes courants ici, le premier étant que les objets chargés se mettent parfois dans une liste. Cela provoque le tri de la liste par ordre des objets chargés, plutôt que par l'ordre dans lequel ils se trouvaient lors de l'enregistrement du jeu. Une fois ces listes identifiées, la solution facile consistait simplement à trier les listes dans un ordre déterminé. Le deuxième problème est que les objets lus depuis la sauvegarde font parfois référence à d'autres objets de la sauvegarde, qui n'ont pas encore été lus. La chose que nous faisons ici est de sauvegarder l'identifiant de l'objet mentionné dans la save et le déréférencement dans une étape après le chargement de la sauvegarde.

Après check_save ait abouti à des sauvegardes sans différences, nous avons commencé à exécuter des tests MP pour trouver plus de problèmes. Une chose qui nous aide beaucoup est le randomlog, un outil que nous utilisons pour suivre les séquences de calcul désynchronisées. La façon dont cela fonctionne est que nous ajoutons des lignes dans le code qui imprime au randomlog, quand un desync arrive, nous pouvons alors comparer les données du randomlog et de l'hôte à celle du client désynchronisé et voir ce que le client a fait différemment. Cela nous montre ce qui s'est passé de manière incorrecte, mais n'est généralement pas suffisant pour déterminer pourquoi. Si nous ne pouvons pas comprendre ce qui s'est passé, nous ajoutons plus d'entrées dans le code associé pour essayer de nous rapprocher du problème source.

Cela peut être un processus lent où nous devons parfois ajouter plus de journaux plusieurs fois pour nous aider à trouver le problème, en particulier si la désynchronisation ne se produit pas régulièrement en raison du multithreading ou de désynchronisation exceptionnelle.
Comme le temps d'AQ est limité pour trouver des désynchronisations, les tests étaient lents, et nous savions que nous avions beaucoup de désynchronisation à trouver, donc nous devions commencer à automatiser les tests. Pour cela, nous avons mis à jour la version autonome du serveur et amélioré le script que nous utilisons pour nous aider à trouver plus rapidement les désynchronisations. Cela nous a également permis d'exécuter les tests automatisés pendant les weekends et les nuits. Cela a également été mis à jour pour redémarrer lorsqu'un problème était trouvé, générant un grand nombre de désynchronisations différentes.

Comme nous pouvions maintenant obtenir plusieurs désynchronisations avec des journaux et des données, nous devions améliorer notre méthode de collecte de données de désynchronisation, donc nous avons copié sur le système de décharge OOS de stellaris. Ce système copie les données relatives à la désynchronisation dans un dossier unique dans le dossier Paradox Interactive / Europa Universalis IV / oos. Le nom du dossier est unique, décrivant la desync et peut être utilisé pour faire correspondre la désynchronisation entre les clients et l'hôte.
Dans l'ensemble, j'ai travaillé sur tout cela pendant les 7 derniers mois avec beaucoup d'aide de l'équipe, beaucoup de systèmes ont dû être corrigés et des solutions spécialisées ont dû être inventées, ça a été une tâche bien plus grande qu’initialement prévu. J'espérais obtenir un jeu parfait pour cette sortie, mais ce n'est pas encore tout à fait le cas.

Donc, si vous obtenez des désynchronisations, nous vous recommandons de nous le faire savoir, essayez de nous donner autant d'informations que possible et plus précisément sur comment le jeu a été configuré, la décharge OOS et toutes les sauvegardes que vous avez pu charger. Si vous êtes désynchronisé, je recommande de démarrer le jeu avec les options de lancement "-randomlog" et "-hardoos" sur l'hôte pour générer de meilleures données pour les dumps OOS. Mais sinon, il vaut peut-être mieux le désactiver car il utilise de la mémoire et ralentit le jeu. Je vais examiner si nous pourrions éventuellement utiliser quelque chose comme le téléchargeur de vidage sur incident pour vous aider à nous envoyer ces données.

Beaucoup de travail sur le multijoueur a été fait, et ça continuera. Cross Platform, Cross DLC et Hotjoin devraient maintenant fonctionner. Le signalement de vos désynchronisations pourrait les corriger plus rapidement. Si vous avez des questions ou des suggestions, je serais heureux de discuter de ce sujet.

Merci Alexivan. La semaine prochaine, nous aurons un autre sac de goodies pour Cradle of Civilization. Avec la sortie dans seulement quelques semaines, nous devons compléter toutes les nouveautés à venir en 1.23 et sur Cradle.

Mais ce carnet des devs n'a aucune image ... hmm, on peut changer cela.
Vous pouvez discuter du patch ici.