Soll ich Textdateien für meine gespeicherten Daten verwenden?

22

Meine Frage ist, ob ich Textdateien verwenden soll, um meine Spieldaten zu speichern. Ich habe einige grundlegende Bedenken, dies zu tun:

  1. Es gibt wirklich keine Möglichkeit, die Daten zu schützen, und daher könnte der Benutzer alles vermasseln, wenn er es berührt, und ich möchte nicht, dass das passiert.

  2. Es ist wahrscheinlich nicht die effizienteste Art, meine Daten zu speichern (es wird eine Menge davon geben)

Ich weiß, wie man Textdateien effektiv parst / schreibt, daher waren sie für das Prototyping fantastisch. Ich möchte nur in die Zukunft blicken, um herauszufinden, wozu ich wechseln soll, damit es mich gegen Ende der Entwicklung nicht ins Gesicht schlägt.

Was soll ich verwenden, wenn ich keine Textdateien verwenden soll? Ich brauche etwas C ++ kompatibles.

Althezel
quelle
2
ZIP-Dateien (mit Passwort) - Es gibt viele Bibliotheken, die dies ermöglichen, und es sollte Speicherplatz sparen
SeanC
2
Das Anwenden einer einfachen Chiffre wie en.wikipedia.org/wiki/ROT13 sollte ausreichen, um den durchschnittlichen Benutzer davon abzuhalten, die Dateien zu bearbeiten. Alle anderen wissen wahrscheinlich sowieso, was sie tun.
Exilyth
1
Mach es wie du willst, aber ich mag es, wenn meine Spiele leicht zu ändern sind.
mmyers

Antworten:

28

Im Moment sind Textdateien wahrscheinlich in Ordnung, da Sie gerade erst anfangen. Ihre Frage enthält einige Bedenken, auf die ich eingehen werde.

  1. Der Schutz der Daten ist nicht so wichtig, wie Sie wahrscheinlich denken. Wenn es sich um ein Multiplayer-Spiel handelt, werden die Daten trotzdem serverseitig gespeichert. Wenn Ihr Spiel ein Einzelspieler ist, was ist, wenn die Spieler die Daten ändern? Wenn sie etwas kaputt machen, ist es wirklich ihre Schuld und sie können es neu installieren.

  2. Leistung ist auch etwas anderes, das wir oft nicht richtig planen. Sie sollten nicht wirklich optimieren, bis Sie tatsächlich ein Leistungsproblem messen . Ich vermute, dass Sie wahrscheinlich eine Datenmenge haben werden, die nicht so groß ist, und dass Textdateien in Ordnung sind.

Abgesehen davon ist Ihre beste Wahl, Ihre Routinen zum Speichern und Laden von Daten so gut wie möglich zu abstrahieren. Beispielsweise können Sie eine Basisklasse haben DataWriterund dann verschiedene Implementierungen ihrer verschiedenen Methoden bereitstellen. Ein sehr einfaches Beispiel würde so aussehen:

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
  }
};

Wenn Sie Ihr Spiel irgendwann profilieren und feststellen, dass der Leistungsengpass in der Dateischreibroutine liegt, können Sie eine andere Implementierung dieser Klasse bereitstellen (zum Beispiel, um stattdessen in eine Datenbank zu schreiben), mit minimalen Änderungen am aufrufenden Code.

pwny
quelle
Es ist ein Einzelspieler-Spiel, und das waren genau meine Gedanken, wenn sie mit den Daten herumspielen wollten. Ich weiß nicht, etwas über Textdateien schien einfach unprofessionell zu sein, und ich dachte mir, ich sollte es wahrscheinlich tun, wenn ich den Benutzer davon abhalten könnte, Fehler zu machen. Also, was meinst du, wenn du "Datenbank" sagst? Ich höre das viel herumgeschleudert, aber ich habe keine Ahnung, was für eine genaue Definition oder welche Art von Datei das beinhaltet.
Althezel
6
@Althezel Egal, wie Sie Ihre Daten speichern, jemand, der entschlossen genug ist, sie zu ändern, kann dies. In diesem Sinne ist es normalerweise eine Verschwendung Ihrer kostbaren Entwicklungszeit, zu versuchen, Schutzmaßnahmen zu
ergreifen
@Althezel Stellen Sie sich die Datenbanken als eine Art Engine vor, an die Sie Anforderungen zum Lesen oder Schreiben von Daten übergeben. Diese Engine ist für das Speichern / Lesen auf effiziente Weise verantwortlich, normalerweise in relationaler Form in Tabellen. In Ihrem Anwendungsfall würde ich einen Blick auf SQLite werfen ( sqlite.org ). Grundsätzlich würden Sie eine C ++ - Bibliothek verwenden, um eine Verbindung zu einer lokalen SQLite-Datenbank herzustellen (SQLite verwendet lokale Dateien) und diese Bibliotheksaufrufe in SQL-Syntax übergeben, um auf Ihre Daten zuzugreifen.
Pwny
2
Es ist eine traurige Welt, wenn Entwickler Benutzer von Informationen fernhalten möchten, die sie auf ihren Computern speichern.
ClassicThunder
2
Es fühlt sich wirklich nur unprofessionell an, Textdateien zu verwenden, da nur sehr wenige Spiele die Datei "save-data.txt" speichern. Wenn Sie jedoch jemals Zeit damit verbracht haben, die meisten gespeicherten Spieledateien zu durchsuchen, werden Sie feststellen, dass es sich häufig nur um Textdateien handelt Manchmal werden Binärdaten hinzugefügt. Beispielsweise verwendet jedes Civilization- und Total War-Spiel tatsächliche TXT-Dateien für eine Vielzahl von Spieldaten. Das häufigste 'Upgrade' ist ein Datenbanksystem, bei dem die Daten als Flat-File gespeichert werden, das - mit Ausnahme einiger binärer Blobs - nur eine Textdatei ist.
BrianH
3

Das Wort Spieldaten kann zum Beispiel viele Dinge bedeuten

  • Gamestate
  • Konfigurationsdateien
  • Karten, Texturen, Sounds, Skripte, Animationsdaten, ...
  • Lokalisierung
  • GUI-Layoutdaten
  • mehr habe ich nicht gedacht

Für jede Kategorie können Sie einen anderen Ansatz wählen.

Zum Beispiel könnten Sie SQLite für Lokalisierungsaufgaben, Binärdateien für Maps, Texturen, Sounds usw. verwenden.

Für Konfigurationsmaterial sollten Sie einfach zu ändernde XML-Dateien verwenden.

Wie immer lautet die richtige Antwort "es kommt darauf an".

Es gibt viele XML-Parser mit einer C ++ - Bindung und auch eine C ++ - Bindung für SQLite.

Quonux
quelle
Es mag eine religiöse Angelegenheit sein, aber ich würde lieber das INI-Dateiformat für Konfigurationen anstelle von XML verwenden. Letzteres fühlt sich für dieses Szenario wie ein Overkill an. In Boost-Bibliotheken gibt es einen INI-Reader.
Artur Czajka
0

Sie können Ihre Daten als Binär-Blob speichern und die Daten erneut übertragen, wenn Sie auf diese Datei zugreifen. Dies würde beide Probleme lösen. Stellen Sie einfach sicher, dass der Serialisierungscode genau mit der Deserialisierung übereinstimmt.

Das Streamen im binären Blob ist relativ schnell und verhindert, dass der Benutzer die Daten sieht und ändert.

All dies können Sie mit den Standardbibliotheksdatenströmen erreichen.

SuperSquareBoy
quelle
2
Binäres Blob ist zwar schnell und einfach (sowohl zum Entwickeln als auch zum Laden / Ausführen), aber das größte Problem, das ich mit binärem Blob hatte, ist, sobald Sie etwas an der Datenstrukturorganisation geändert haben (so viel wie das Hinzufügen eines einzelnen floatMitglieds zu einem einzelnen Objekt), werden die alten Spielstände komplett ungültig. Während der Entwicklung ist es schwierig, damit umzugehen, aber wenn Sie dazu bereit sind, dann auf jeden Fall.
Bobobobo