Bonjour à tous !
Je suis en train de coder un MUD (Multi User Dungeon) en C++. Un MUD est un jeu en ligne textuel dont on pourrait dire qu'ils sont les ancêtres des MMORPGs. Les joueurs créent des personnages, tuent des monstres, gagnent des niveaux, des sorts, trouvent des objets, se déplacent de salles en salles, etc.
D'un point de vue technique, c'est un simple serveur écrit en C++. Les joueurs se connectent via des clients MUDs (que je n'ai pas à coder, donc). Pour la partie réseau, j'utilise Boost Asio.
Mon problème :
Je suis en train de me demander de quelle façon je vais m'assurer de la persistance des données. Idéalement, j'aurais bien aimé avoir une base de données relationnelle parce que j'aimerais avoir la possibilité d'interroger facilement mes données. Concrètement, ça me permettrait d'avoir par exemple la liste de tous les orques ayant plus d'1 million de pièces d'or, ayant au moins 2 bateaux et faisant partie d'une guilde.
Ma stratégie consisterait à :
- charger toutes mes données au lancement du serveur
- pendant que le serveur est lancé, sauvegarder uniquement les objets nécessitant d'être mis à jour, toutes les minutes
Seulement voilà : je vais devoir persister un graphe d'objets relativement complexe. Les objets feront références les uns aux autres via des pointeurs. Je vais très certainement avoir des cycles de dépendances entre eux.
Et je n'arrive pas à me décider sur la façon dont je vais procéder. Ça fait des mois que j'y réfléchis sans trouver de solutions acceptable. J'ai pas mal cherché sur internet et j'ai pu lire tout et son contraire.
J'ai identifié les trois possibilités suivantes :
1) je sauvegarde tout dans une base de données relationnelle avec des Data Mapper. Je construis des requêtes SQL et j'essaie tant bien que mal de trouver un système me permettant de sauvegarder mes objets avec leurs dépendances (pas évident)
2) j'utilise un ORM comme ODB pour sauvegarder mes données dans une base de données relationnelle. Est-ce que la performance sera suffisante ? Est-ce que je ne serais pas limité dans la façon dont je conçois mes classes C++ ?
3) j'utilise Boost Serialization. Est-ce que la performance sera suffisante ? Est-ce que ça va pas allonger considérablement la durée de compilation ? Est-ce que j'arriverais à optimiser ma sauvegarde une fois le serveur lancé pour ne sauvegarder que les objets nécessitant d'être mis à jour ?
Je pense avoir une préférence pour la solution 1), parce que je pourrais tout contrôler. Mais je ne sais pas si je ne me lance pas dans une grosse galère. Est-ce que ça vous parait faisable ?
C'est pourquoi, j'aimerais bien avoir votre avis. Si vous pouviez m'aiguiller un peu, ça serait sympa.
A priori, tous les utilisateurs de C++ ont besoin de sauvegarder leurs données d'une façon ou d'une autre. J'ai du mal à concevoir que le sujet puisse être aussi complexe. En faisant des recherches sur internet, j'ai eu l'impression que c'était, peu importe la façon dont on s'y prend, TOUJOURS une grosse galère.
Merci !
Daily
Partager