Portage du client Dofus 2 - WebGL / WebGPU

Alpa#1269

Membre
Inscrit
27 Février 2026
Messages
206
Je bosse depuis plusieurs mois sur une implémentation complète du client Dofus 2 qui tourne dans le navigateur (et en desktop via Electron)
C'est un port technique du client, pas un serveur, mais il est conçu pour être compatible avec les serveurs Dofus 2

Je me suis dit que le projet était maintenant suffisamment mature pour en parler et faire un post dessus

## Mes motivations
Avant de rentrer dans la technique, un mot rapide sur le pourquoi.
Le projet est né de plusieurs frustrations.

La première, c'est à quel point le client Dofus 3 est bug et lent. Ma conviction personnelle, c'est qu'utiliser Unity pour un jeu comme Dofus était une mauvaise idée à la base, mais qu'en plus, a priori, le client a toujours autant de soucis, de bugs et de problèmes de performances. Je trouve ça regrettable, et j'aimerais proposer une alternative à ce qu'aurait pu être Dofus s'ils avaient fait les bons choix (rien que ça).

La deuxième frustration est liée au fait que Dofus 3 est aujourd'hui très fermé et obfusqué. Pour l'avenir des serveurs privés, partir sur du développement basé sur le client officiel ne me semble pas la bonne approche, c'est bien trop limité sur la durée. Et puis soit tu pars sur la version 3.0 de la bêta, qui avait énormément de bugs mais au moins le protocole était en clair. Soit tu te bases sur la version récente, mais dump tout le protocole est un enfer, et au final tu te retrouveras toujours avec quelques bugs chiants et des problèmes de performances

Du coup, l'idée c'est de proposer quelque chose qui colle vraiment à ce qu'on attend en 2026 :
- Aucune installation lourde. Tu ouvres ton navigateur et tu joues, ou tu prends la version Electron si tu préfères un vrai exécutable
- Des interfaces repensées, et surtout la possibilité d'en ajouter de nouvelles spécifiques au serveur (events custom, outils communautaires, etc..) sans devoir bricoler autour d'un client compilé
- Une cible cross-plateforme plus large : Windows, Mac, Linux, et potentiellement mobile à terme, sans avoir à maintenir trois builds différents
- Ajouter énormément de petits QoL (quality of life) qu'Ankama ne prend pas le temps de faire, CF:
- Plus de fluidité (on peut faire tourner plusieurs centaines de joueurs sur une même map à + de 100 FPS), moins de lag, moins de chargements à rallonge, pas de fuite de mémoire (enfin... pour l'instant). On ne dépend ni de Flash ni des limites du moteur officiel, toute la logique est "visible", rien de bloated, c'est écrit en WebGL (et WebGPU) pur, donc rien de caché à part l'abstraction que cause JavaScript de base

Au-delà du serveur, je trouve ça intéressant pour la communauté Dofus en général : montrer qu'on peut faire tourner Dofus 2 proprement sur des technos modernes, sans dépendre de Flash ni d'Unity

## Les interfaces
Le projet utilise React, ce qui permet d'avoir une grande liberté et beaucoup de simplicité sur la composition des UI

À la base, j'avais commencé à vibe coder des UI, mais c'était très limité et honnêtement pas très beau. J'ai donc pensé à une autre approche : vu qu'Ankama utilise un tool Figma → Unity, je me suis dit qu'il était sans doute possible de récupérer cet output et de faire un Unity → HTML/CSS
J'ai donc écrit un tool capable d'extraire les fichiers USS / UXML et les textures utilisées, ainsi qu'un converter qui me génère des fichiers TSX complets, ce qui me permet d'avoir un rendu quasiment 1:1 avec ce qui se fait sur le client officiel

Voici par exemple l'affichage en jeu actuel :
[Connectez-vous pour voir ce lien]
[Connectez-vous pour voir ce lien]
 
## Les assets
Comme beaucoup le savent déjà, le client Dofus 2 d'origine tourne en Flash. Tout le contenu visuel (sprites des personnages, animations, monstres, items, certaines tiles de map…) est packagé dans des fichiers SWF

Forcément, pour être plus moderne, il faut se séparer de ce format-là. Après beaucoup d'itérations, je pense qu'exporter en PNG / JSON (comme le fait Dofus Touch / Dofus 3) est effectivement à priori la meilleure solution (même si je regarde de près la solution utilisé par Grandnainconnu sur son client Retro)

Le format SWF est vectoriel : ce ne sont pas des pixels mais des formes géométriques qui permettent de dessiner les sprites. L'avantage, c'est qu'on peut zoomer sans aucune perte de qualité, ce qu'on perd justement avec le passage en PNG. Du coup, pour compenser, certains assets (notamment les personnages) sont exportés en zoom x4, histoire de ne pas avoir de perte de qualité visible, surtout lors d'un zoom en jeu

J'ai donc d'abord utilisé Jeff ([Connectez-vous pour voir ce lien]), un tool créé par Wizcorp, la société japonaise d'Ankama en charge de Dofus Touch. Ce tool est d'ailleurs aussi utilisé pour l'exportation des assets sur Dofus 3. Jeff est open source mais n'est plus maintenu, et la version qu'ils utilisent en interne est différente et plus complète, j'ai donc dû pas mal l'adapter, surtout sur la gestion des masks et autres filters

Le deuxième problème de cette méthode (en plus de la perte de qualité), c'est que c'est assez lourd sur le disque. Pour le moment, j'ai fait le choix de tout charger en remote sur un CDN, mais c'est à voir, peut-être avoir une option pour précharger certaines ressources, ou pour les télécharger en fond comme ça se fait régulièrement sur les jeux mobiles

## Les performances
À noter que par défaut le jeu tourne en VSync, car c'est beaucoup plus logique pour un jeu dans ce style-là et sur navigateur

Voici un exemple avec 1000 entités sur une map : [Connectez-vous pour voir ce lien]
Sur cet exemple, le renderer encaisse 1010 entités à 100 FPS en WebGL2, avec ~3550 draw calls par frame et seulement 125 Mo de mémoire GPU. Le rendu n'est même pas encore complètement batché, il reste pas mal de marge pour optimiser, mais même en l'état ça reste largement au-dessus de ce que fait le client Dofus 2, à titre de comparaison, sur Flash ça tourne à 50 FPS de base, avec souvent des baisses à 30-40

# L'état du projet
Un mot rapide sur ce qui marche aujourd'hui et ce qui reste à faire, histoire d'être clair
Ce qui est en place :
- Connexion au serveur (login, sélection de personnage, arrivée en jeu)
- Chargement et rendu des entités (personnage joué, autres joueurs, monstres)
- Changements de maps, lancer un combat, se déplacer, les montures, les prismes, etc..
- Infobulles
- Le HUD du jeu complet avec toute les options qui marchent
- Le mode créature
- Les combats, mais dans une version vraiment minimaliste pour l'instant (jouable, mais moche / pas agréable)

Je suis entrains de convertir et coder toute les interfaces manquantes, donc caractéristiques, sorts, social, inventaire etc..
C'est un assez gros chantier mais c'est ce qui rend le jeu jouable finalement
Globalement, j'en ai probablement encore pour 2 mois de boulot avant d'avoir un client qui couvre vraiment toutes les fonctionnalités de base. Mais le socle est là, et je posterais sans doute mon avancé au fur et à mesure
 
Par rapport au streaming des assets il faut adopter une technique similaire à ce que faisait WoW à une époque : En gros tu pars d’un bundle « obligatoire » qui devra être chargé pour arriver en jeu, là dedans tu inclus tout ce qui touche aux interfaces et à incarnam, puis ensuite tu fais streamer au client pendant qu’il joue les assets de la prochaine zone adjacente du jeu
 
Par exemple quand t’es à incarnam il va charger en priorité Astrub, puis cania, puis les abraknyde, …
 
Et si tu reste suffisamment afk à incarnam tu finis par avoir l’intégralité du cache
 
Soit ça, soit faire en sorte que quand t’es sur une map, ça precharge depuis le CDN les Maps adjacente, comme ça quand t’arrive sur une map, le temps que ton perso navigue à la prochaine, t’aura pas de temps de chargement car t’aura déjà les Maps d’à côté en cache
 
Après c’est des problématique qui existent seulement si tu veux un streaming client
 
Il y a tellement de travail, c'est choquant, webGL me parait super intéressant pour la portabilité de la chose, tu as rencontré des limitations ? (cache, performances, ...) ?
Au niveau du protocole, tu es sur celui de d2, ou sur des structures protobuf ?
 
Pourquoi ne pas avoir utilisé du svg pour les assets graphique au lieu du png egalement ?
 
Retour
Haut Bas