Qu'est-ce qu'un bon format de fichier pour sauvegarder les données de jeu? [fermé]

37

Je dois sauvegarder des données de jeu personnalisées. Carte, joueur, etc.

Tous auront des "sous-objets". Par exemple, une carte et une carte auront un "tableau" de tuiles. c'est-à-dire des données hiérarchiques. Espérons que rien n'est binaire.

Quel serait un bon format pour ceux-ci?

Jusqu'ici, j'ai envisagé:

Sérialisation: C’est rapide et facile, mais a tendance à casser lorsque je change de classe :(

XML: Je déteste vraiment analyser cela. Mon cas de test comptait plus de 100 lignes de code et semblait plaire à des tonnes de "travail occupé", même pour un format très simple.

INI: serait vraiment maladroit pour les données hiérarchiques.

Protobuf: Je ne l' ai jamais utilisé, mais lisez, vous devez faire beaucoup de travail manuel et casser si vous changez de classe.

Autres options? C'est pourquoi je suis ici!

Edit: il s'agit de Java.

Edit 2:

J'ai opté pour la "sérialisation binaire contrôlée" (voir ci-dessous).

Avantages:

  • c'est rapide

  • il est petit (sur disque) et peut être facilement compressé / décompressé en lecture / écriture.

  • c'est super facile à lire / écrire à partir de jeux et d'outils.

  • Je peux décider quoi inclure / exclure de l'objet.

  • Les objets / données peuvent être imbriqués.

Les inconvénients:

  • Impossible de l'éditer à la main (comme XML, YAML, etc.)

  • Ne peut pas facilement lire / modifier avec des scripts

  • La sérialisation Java par défaut est assez lente / gonflée par rapport aux autres implémentations, mais elle est stable et fonctionne

utilisateur697111
la source
3
valeurs séparées par des virgules
Thomas Eding
@trinithis KISS est une bonne chose.
Nate
3
Ne tombez pas dans le piège qu'il est facile de procéder à une
Tetrad
Drôle, ProtoBuf a été conçu pour prendre en charge la mise à niveau.
Jonathan Dickinson
ini pour tout ce qui est modifiable par l'utilisateur, comme les paramètres, etc. et binaire pour tout le reste.
Uğur Gümüşhan le

Réponses:

38

YAML ou JSON seraient de bonnes options pour afficher des données hiérarchiques . Ils sont beaucoup plus simples et faciles à analyser que XML.

Une autre option serait un processus de sérialisation binaire "contrôlé". Chaque objet écrit son état de manière contrôlée, c'est-à-dire

void player::save(savegame &sgm)
{
    sgm.write(this->position);
    sgm.write(other properties);
    inventory.save(sgm);
}

id Tech 4 (moteur Quake 4 / Doom 3) utilise une telle approche.

Raphael R.
la source
+1 Pour la sérialisation binaire "contrôlée". J'utilise cela au travail et c'est génial!
NoobsArePeople2
1
Un autre +1 pour la sérialisation binaire "contrôlée". Bien que je n’aie jamais entendu le nom auparavant, je fais quelque chose de similaire à quelques endroits - bien fait, cela présente l’avantage de pouvoir définir des valeurs par défaut pour les champs nouvellement ajoutés qui n’existent pas dans le fichier de données et d’ignorer " "junk" dans le fichier de données lorsqu'un champ est supprimé du modèle.
Izkata
J'utilise quelque chose comme ça dans mon jeu. Ça marche bien! J'utilise java. Chaque objet a une méthode ToByteStream qui écrit dans un flux de fichiers et un constructeur qui lit un flux de fichiers. Je n'ai pas aimé l'implémentation Javas Serializable.
MichaelHouse
4
Ou vous pouvez simplement utiliser Boost.Serialize et obtenir de merveilleuses fonctionnalités telles que la gestion de version, etc.
Nicol Bolas
@ Izkata J'ai inventé ce nom parce que je ne sais pas comment cette méthode s'appelle.
Raphael R.
9

Un format binaire bien conçu présente tous les avantages, il est rapide, relativement petit et aussi flexible que vous le créez.

Faire un format binaire n’est lié à aucune règle, ce qui est un avantage considérable, mais ironiquement, c’est en grande partie ce qui a donné un mauvais nom aux structures de fichiers binaires. XML, JSON et autres prennent beaucoup de décisions pour vous. Ils sont loin d'être toujours optimaux, mais ce sont des choix raisonnablement sûrs qui vous aideront généralement à éviter certains problèmes autrement courants.

Identifiez ces problèmes, concevez votre format en fonction de ceux-ci et créez un excellent format binaire.

Si vous n'êtes pas assez expérimenté / suffisamment en confiance pour créer un format binaire et que la quantité de données est suffisamment petite pour que l'impact sur la vitesse soit négligeable, je vous suggère d'utiliser JSON, c'est simple, mais fait le travail.

aaaaaaaaaaaa
la source
6

Le choix du format de fichier dépend énormément de votre ensemble d’outils actuel et du jeu que vous avez l’intention de faire. Ceci étant dit...

Toolset est l’un des facteurs les plus importants pour choisir un format de fichier de jeu. Si vous créez un format binaire , vous devez toujours vous assurer que vous avez les outils pour saisir vos données de jeu. Cela peut être aussi simple qu'un éditeur hexadécimal, ou aussi complexe que Unreal Editor.

Je suppose que le principal avantage de XML, YAML ou de tout autre fichier de langue est que vous pouvez le modifier facilement via un éditeur de texte. Et en utilisant une norme existante, cela garantit que vous ne pouvez pas vous tromper . Mais cela est extrêmement fastidieux lorsque vous avez mille fichiers, ce qui m'amène à mon point suivant.

Jeu. Quel genre de jeu faites-vous? Pourquoi je dis que cela affectera le format du fichier? Parce que, si vous créez quelque chose comme Bomberman 2D, vous pourriez vous en tirer avec un simple fichier texte tel que:

*********
*1     2*    1,2,3,4  - start point of players 1, 2, 3, 4
* + + + *    *        - walls
*       *    +        - crates
* + + + *
*3     4*
*********

En d'autres termes, optez toujours pour le format le plus évident pour vos données spécifiques . Les jeux de rôle sont le genre de jeu le plus complexe à créer. Ils nécessitent beaucoup de données. Mais cela ne signifie pas que vous devez respecter un format spécifique , binaire ou textuel, pour toutes les données du jeu.

  • Les cartes, particules et autres éléments graphiques ont tendance à utiliser un format binaire personnalisé. Parce que c'est le moyen le plus simple de le mettre en œuvre . Ce n'est pas humainement sain de décrire des cartes textuellement. Généralement édité via des éditeurs de carte / niveau / particule.
  • Les joueurs, les objets, les ennemis, les compétences et les quêtes sont des statistiques qui affectent l’équilibre du jeu . Ils nécessitent généralement beaucoup d’informations et d’ajustements. J'aime faire cela en le mettant dans un fichier XML pour faciliter son implémentation, tout en ayant un éditeur d'objets pour que les concepteurs puissent jouer. Le meilleur des deux mondes .

En règle générale, vous souhaitez décrire un texte au format texte et des graphiques au format binaire. Ce qui suit devrait vous donner un exemple:

<Skill>
    <Name>Fireball</Name>
    <Animation>fireball.dat</Animation> <!-- Graphics described in another file -->
    <Attack>1.3</Attack>
    <Cooldown>15</Cooldown>
</Skill>

Pour résumer, il est vivement recommandé que, si possible, vous ne scriptiez pas vos données, sauf en cas d'absolue nécessité . L'utilisateur final ne se soucie pas de la qualité du format, tant que le jeu est jouable, c'est tout ce qui compte.

Cordialement, roy =)

Roy
la source
5

BSON est plutôt sympa. http://bsonspec.org/ . Il est plus facile d'analyser que JSON et de mieux contenir des données binaires, mais il a quand même une belle structure. C'est un peu similaire aux tampons de protocole. L'inconvénient est qu'il semble y avoir beaucoup d'outils en dehors de Mongodb.

EDIT: MsgPack ( http://msgpack.org/ ) est également similaire à BSON et semble gagner du terrain.

basique
la source
1
Bien que je pense que l'idée d'un "JSON binaire" est bonne, j'ai peu confiance en BSON, mais il y a trop de types de données (redondants) et la documentation est nulle.
aaaaaaaaaaaaa
2

Qu'est-il arrivé à votre format de données binaires personnalisé? Si vous avez peur de la sérialisation brute, écrivez votre propre système qui écrit les champs selon vos besoins et les lit. Pas besoin de xml, qui est en effet trop volumineux et complexe pour les situations où vous n'avez pas besoin de la transparence fournie par le format. Définissez simplement un format de fichier bien spécifié et respectez-le, en laissant peut-être de la place pour l’extension de votre ensemble de données dans chaque enregistrement en les complétant avec des valeurs null (supposons que vous ayez un enregistrement de 100 octets maintenant, fixez-le à 150 pour une utilisation future.
Ajoutez un numéro de version et peut-être une somme de contrôle afin de savoir quels champs doivent être renseignés et de vérifier leur validité, et le tour est joué.

jwenting
la source
1

Vous pouvez combiner XML ou un autre format avec des insertions Base64 pour certaines données. Pour les champs dont vous avez besoin de lisibilité, vous pouvez utiliser le texte habituel.

Yevhen
la source