Dois-je utiliser des fichiers texte pour mes données de sauvegarde?

22

Ma question est de savoir si je dois ou non utiliser des fichiers texte pour enregistrer mes données de jeu. J'ai quelques préoccupations fondamentales à ce sujet:

  1. Il n'y a vraiment aucun moyen de protéger les données, et donc, l'utilisateur pourrait tout gâcher s'il les touchait et je ne veux pas que cela se produise.

  2. Ce n'est probablement pas le moyen le plus efficace de stocker mes données (il y en aura beaucoup)

Je sais comment analyser / écrire efficacement dans des fichiers texte, donc pour le prototypage, ils ont été fantastiques. Je veux juste regarder vers l'avenir pour savoir ce que je devrais penser à changer pour qu'il ne me frappe pas au visage vers la fin du développement.

Si je ne dois pas utiliser de fichiers texte, que dois-je utiliser? J'ai besoin de quelque chose de compatible C ++.

Althezel
la source
2
Fichiers Zip (avec mot de passe) - il existe de nombreuses bibliothèques disponibles qui vous permettront de le faire, et cela devrait économiser de l'espace disque
SeanC
2
L'application d'un chiffrement simple comme en.wikipedia.org/wiki/ROT13 devrait suffire à empêcher l'utilisateur moyen de modifier les fichiers. Tout le monde sait probablement ce qu'ils font de toute façon.
Exilyth
1
Faites-le à votre façon, mais j'aime que mes jeux soient facilement modifiables.
mmyers

Réponses:

28

Pour l'instant, puisque vous ne faites que commencer, les fichiers texte sont probablement OK. Il y a quelques préoccupations dans votre question que je vais aborder.

  1. La protection des données n'est pas aussi cruciale que vous le pensez probablement. Si votre jeu est multijoueur, vous aurez quand même les données enregistrées côté serveur. Si votre jeu est en solo, que se passe-t-il si les joueurs modifient les données? S'ils cassent quelque chose, c'est vraiment de leur faute et ils peuvent réinstaller.

  2. La performance est également autre chose que nous échouons souvent à planifier correctement. Vous ne devriez pas vraiment optimiser avant d'avoir réellement mesuré un problème de performances. Je suppose que vous aurez probablement une quantité de données qui n'est pas si grande et que les fichiers texte iront très bien.

Cela étant dit, votre meilleur pari est d'abstraire au mieux vos routines d'enregistrement et de chargement de données. Par exemple, vous pouvez avoir une classe de base, par exemple DataWriter, puis fournir différentes implémentations de ses différentes méthodes. Un exemple très basique ressemblerait à:

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

Lorsque vous profilez votre jeu et réalisez que le goulot d'étranglement des performances se trouve dans la routine d'écriture de fichier, vous pouvez fournir une autre implémentation de cette classe (par exemple pour écrire dans une base de données à la place) avec un minimum de modifications du code appelant.

pwny
la source
C'est un jeu solo, et c'était exactement ce que je pensais s'ils voulaient jouer avec les données. Je ne sais pas, quelque chose à propos des fichiers texte semblait juste non professionnel, et je me suis dit que si je pouvais empêcher l'utilisateur de foirer, je devrais probablement le faire. Aussi, que voulez-vous dire lorsque vous dites "base de données"? J'entends beaucoup ça, mais je n'ai aucune idée de la définition exacte ou du type de fichier que cela implique.
Althezel
6
@Althezel Le fait est que, quelle que soit la façon dont vous enregistrez vos données, une personne suffisamment déterminée pour les modifier pourra le faire. En ce sens, c'est généralement une perte de votre précieux temps de développement pour essayer de mettre en place des protections :)
pwny
@Althezel Quant aux bases de données, pensez-y comme une sorte de moteur auquel vous transmettez des requêtes de lecture ou d'écriture de données. Ce moteur est chargé de l'enregistrer / le lire de manière efficace, généralement sous forme relationnelle dans des tableaux. Dans votre cas d'utilisation, j'examinerais SQLite ( sqlite.org ). Fondamentalement, vous utiliseriez une bibliothèque C ++ pour vous connecter à une base de données SQLite locale (SQLite utilise des fichiers locaux) et transmettriez ces appels de bibliothèque dans la syntaxe SQL pour accéder à vos données.
pwny
2
C'est un monde triste où les développeurs veulent pouvoir verrouiller les utilisateurs sur les informations qu'ils stockent sur leurs ordinateurs.
ClassicThunder
2
Il n'est vraiment pas professionnel d'utiliser des fichiers texte car très peu de jeux stockent des choses sous le nom "save-data.txt" - mais si vous avez déjà passé du temps à rechercher la plupart des fichiers de jeu enregistrés, vous constaterez qu'ils ne sont souvent rien de plus que des fichiers texte qui ont parfois des données binaires ajoutées. Chaque jeu de la série Civilization et Total War, par exemple, utilise des fichiers .txt réels pour une grande variété de données de jeu. La `` mise à niveau '' la plus courante pour cela est un système de base de données qui finit par stocker les données sous forme de fichier plat qui - à l'exception de quelques blobs binaires - n'est qu'un fichier texte.
BrianH
3

Le mot Game Data peut signifier beaucoup de choses, par exemple

  • Gamestate
  • Fichiers de configuration
  • Cartes, textures, sons, scripts, données d'animation, ...
  • Localisation
  • Données de disposition de l'interface graphique
  • plus je n'y ai pas pensé

Pour chaque catégorie, vous pouvez adopter une autre approche.

Par exemple, vous pouvez utiliser SQLite pour les trucs de localisation, binaire pour les cartes, les textures, les sons, etc.

Pour la configuration, vous devez utiliser des fichiers xml faciles à modifier.

Comme toujours, la bonne réponse est "ça dépend".

Il existe de nombreux analyseurs xml avec une liaison c ++ et une liaison c ++ pour SQLite existe également.

Quonux
la source
Ce pourrait être une chose religieuse, mais je préfère utiliser le format de fichier INI pour les configurations plutôt que XML. Ce dernier se sent comme une surpuissance pour ce scénario. Et il y a un lecteur INI dans les bibliothèques boost.
Artur Czajka
0

Vous pouvez enregistrer vos données en tant qu'objet blob binaire et diffuser les données lorsque vous accédez à ce fichier. Cela résoudrait vos deux problèmes. Assurez-vous simplement que le code de sérialisation est exactement le même que la désérialisation.

Le streaming dans le blob binaire est relativement rapide et empêche également l'utilisateur de voir les données et de les modifier.

Vous pouvez réaliser tout cela en utilisant les flux de bibliothèque standard.

SuperSquareBoy
la source
2
Bien que le blob binaire soit rapide et facile (à la fois pour le développement et pour le chargement / l'exécution), le plus gros problème que j'ai rencontré avec le blob binaire est dès que vous modifiez quoi que ce soit sur l'organisation de la structure de données (autant que vous ajoutez un seul floatmembre à un seul ), les anciennes sauvegardes deviennent complètement invalides. C'est difficile à gérer pendant le développement, mais si vous êtes à la hauteur, alors certainement.
bobobobo