Wie wählt man, wie Daten gespeichert werden sollen?

25

Gib einem Mann einen Fisch und du fütterst ihn für einen Tag. Bringe einem Mann das Fischen bei und füttere ihn ein Leben lang. - Chinesisches Sprichwort

Ich könnte fragen, welche Art von Datenspeicher ich für mein aktuelles Projekt verwenden soll, aber ich möchte das Fischen lernen , damit ich nicht jedes Mal nach einem Fisch fragen muss, wenn ich ein neues Projekt beginne.

Also, bis ich zwei Methoden verwendet habe, um Daten in meinem Nicht-Spiel-Projekt zu speichern: XML-Dateien und relationale Datenbanken. Ich weiß, dass es auch eine andere Art von Datenbank gibt, die NoSQL- Datenbank . Ich würde jedoch nicht wissen, ob mir mehr Auswahlmöglichkeiten zur Verfügung stehen oder wie ich mich zuerst entscheiden soll, abgesehen von einer willkürlichen Auswahl.

Die Frage lautet also: Wie soll ich die Art der Datenspeicherung für ein Spielprojekt auswählen?

Und bei der Auswahl würde mich folgendes Kriterium interessieren:

  • Die Größe des Projekts.
  • Die Plattform, auf die das Spiel abzielt, sowie die verwendete Entwicklungsplattform.
  • Die Komplexität der Datenstruktur.
  • Portabilität von Daten unter vielen Projekten hinzugefügt .
  • Added2 Gleichzeitige Nutzung der Daten zwischen verschiedenen Projekten. (dh Benutzerdaten)
  • Hinzugefügt Wie oft soll auf die Daten zugegriffen werden
  • Mehrere Datentypen für dieselbe Anwendung hinzugefügt
  • Hinzugefügt2 Konfiguration mit mehreren Datenspeichern.
  • Jeder andere Punkt ist für Sie von Interesse, wenn Sie sich für eine Verwendung entscheiden.

BEARBEITEN, von dem ich weiß Wäre es besser, XML / JSON / Text oder eine Datenbank zum Speichern von Spielinhalten zu verwenden? , dachte aber, dass es nicht genau meinen Punkt ansprach. Wenn ich mich irre, würde mir der Fehler gerne auf meine Art und Weise gezeigt.

EDIT2 Einige weitere Punkte hinzugefügt, die ich für relevant halte. Darüber hinaus würde mich interessieren, welche anderen Optionen neben der flachen Dateispeicherung und der relationalen Datenbank zur Verfügung stehen. Was ist zum Beispiel mit nicht relationalen Datenbanken? Wann ist es relevant, eine solche Datenbank über die zuvor genannten anderen Optionen zu nutzen?

Eldros
quelle
Ich würde gerne wissen, warum ich eine Gegenstimme erhalte. Ist meine Frage zu weit gefasst? Off-Topic? Benötigen Sie zusätzliche Informationen?
Eldros
Ich bin nicht der Downvoter. Aber bitte, das wurde viele Male besprochen. Wie wäre es mit einem Suchfeld? Das hat mich dazu geführt: gamedev.stackexchange.com/questions/4666/…
Notabene
1
@notabene: Ich wusste von diesem Thread und dachte irgendwie, der Umfang meiner Frage sei anders als dieser. Sie suchten nach einer Antwort für ein komponentenbasiertes Spiel (was auch immer es ist, aber ich nehme an, es gibt eine andere Art von Spiel) und hatten die Auswahl bereits in gewisser Weise eingeschränkt, und fast jede Antwort behandelte eine Art von Technologie. Auf der anderen Seite frage ich nach einer grundlegenden Methodik für die Auswahl und hätte gerne einen besseren Vergleich. Wenn die Community immer noch davon ausgeht, dass es sich um ein Duplikat handelt, werde ich in Betracht ziehen, diese Frage zu löschen und zu versuchen, meine Antwort auf den anderen Thread zu erhalten.
Eldros
Ansonsten würde ich gerne wissen, was ich ändern soll, um deutlich zu machen, dass es sich um eine andere Frage handelt.
Eldros
@notabene: Ich bin mir sicher, dass es ein Szenario gibt, in dem kein externer Datenspeicher verwendet wird, sondern Daten im "Code" gespeichert werden .
Eldros

Antworten:

21

Ihre Frage ist wirklich weit gefasst, da es so viele Genres gibt, aber hier ist die Perspektive eines professionellen Softwareentwicklers.

Sie haben eine Liste mit Kriterien angegeben, anhand derer Sie bestimmen möchten, welchen Datenpersistenzmechanismus Sie verwenden. Diese waren:

  • Die Größe des Projekts.
  • Die Plattform, auf die das Spiel abzielt.
  • Die Komplexität der Datenstruktur.
  • Portabilität von Daten unter vielen Projekten.
  • Wie oft soll auf die Daten zugegriffen werden?
  • Mehrere Datentypen für eine Anwendung
  • Jeder andere Punkt ist für Sie von Interesse, wenn Sie sich für eine Verwendung entscheiden.

Zunächst müssen wir feststellen, welche Optionen uns zur Verfügung stehen. Da Sie keine Sprache oder Technologie angegeben haben, ist es schwierig, genau zu sagen, aber Sie versuchen wahrscheinlich, sich zwischen XML- und relationalem Datenbankspeicher zu entscheiden .

Ein wichtiger Unterschied zu machen ist , dass XML nicht wirklich ein Speicher ist Mechanismus so viel wie ein Serialisierungstechnik. Auf diese Weise können In-Memory-Strukturen für Ihr Spiel dargestellt werden. In Anbetracht dessen sprechen Sie wirklich von Flat File vs. relationalem Datenbankspeicher . Dies sind nicht die einzigen Optionen, aber sie kommen am häufigsten vor, daher werde ich sie verwenden.

Für flache Dateien:

  • XML
  • JSON
  • YAML
  • XAML
  • Einfacher Text

Für Datenbanken:

  • SQL Server
  • MySQL
  • DB2
  • Orakel
  • Viel mehr

BEARBEITEN: Sie fragten nach anderen Mechanismen als Dateien und relationalen Datenbanken. Der einzige andere bemerkenswerte Datenbanktyp, den ich regelmäßig gesehen habe, sind Datenbanken im Berkeley-Stil, die im Wesentlichen auf Schlüsselwerten basieren. Diese tendieren dazu, B-Bäume zum Strukturieren von Daten zu verwenden, damit die Suche schnell vonstatten geht. Diese eignen sich hervorragend für die Konfiguration / Einstellungssuche, bei der Sie genau wissen, was Sie möchten (z. B. geben Sie mir alle Telemetriedaten für "Stufe 1").

Nachdem wir alle Grundlagen aus dem Weg geräumt haben, gehen wir auf einige Ihrer Kriterien ein.

Die Größe des Projekts.

Einige mögen anderer Meinung sein, aber die Größe Ihres Projekts wird nicht unbedingt einen großen Einfluss auf Ihren Datenpersistenzmechanismus haben. Sie möchten eine wiederverwendbare Bibliothek von Funktionen erstellen, die Daten von jedem gewünschten Mechanismus speichern / laden. Ich würde sogar vorschlagen, eine Abstraktionsebene zu implementieren (sehen Sie sich das Adaptermuster an ), damit Sie Ihren Persistenzmechanismus bei Bedarf problemlos ändern können.

Allerdings kann die Verwendung von XML im Dateisystem bei kleinen Projekten möglicherweise gut funktionieren. Sie sollten jedoch einige Ihrer Sicherheitsbedenken (z. B. Verschlüsselung) berücksichtigen, damit die Player die Daten nicht nach Belieben ändern können.

Die Plattform, auf die das Spiel abzielt.

Die Plattform wird auch kein großes Problem sein. Sie sollten sich mehr Gedanken über Ihre Entwicklungsplattform als über die Zielplattform machen. Der Grund dafür ist, dass einige Sprachen bestimmte Arten von Markups oder Datenbanken besser verarbeiten als andere. Das heißt nicht, dass Sie keines der oben genannten Tools in fast jeder Sprache verwenden können, aber manchmal ist es am besten, die unterstützten Tools zu verwenden, die Ihnen zur Verfügung stehen. Jede Plattform unterstützt Flatfiles und parst XML. Auf mobilen Plattformen sollten Sie jedoch nach Möglichkeit die binäre Serialisierung in Betracht ziehen oder zumindest Ihr XML für die Speicherung optimieren.

Die Komplexität der Datenstruktur.

Das ist eine Art knifflige Sache. Relationale Datenbanken eignen sich hervorragend, um Entitäten und ihre Beziehungen zu speichern. Mit einem relationalen Speicherrepository können Sie die Struktur besser erzwingen als mit Dateien in einem Dateisystem. Berücksichtigen Sie die Arten von Beziehungen zwischen Ihren Entitäten sowie die Häufigkeit, mit der Sie sie ändern oder verwandte Entitäten finden. Für extrem komplexe Strukturen würde ich vorschlagen, die Datenbankroute zu wählen.

Portabilität von Daten unter vielen Projekten.

Wenn es um Portabilität geht, sollten Sie berücksichtigen, dass Datenbanken von Natur aus schwerer sind als Dateien. Es ist mit Installations- und Konfigurationsaufwand verbunden, verschiedene Datenbanken werden für verschiedene Plattformen verfügbar sein usw. SQLite ist ein ziemlich guter Weg, dies zu umgehen. Wenn es jedoch um Portabilität geht, werden Sie mit dateibasierten Lösungen wie XML wahrscheinlich leichter zurechtkommen.

EDIT: Es gibt einige andere Bedenken, die Sie in einem Ihrer Kommentare zur Portabilität angesprochen haben. Letztendlich möchten Sie nicht, dass Ihre Daten zu eng an ein Produkt oder einen Dateityp gekoppelt werden. Am besten ist es, wenn Sie Bestandsdaten (Ebenen, Gegner usw.) in einem abstrakten Format (durch Tabulatoren getrennte Dateien, XML usw.) speichern können, das Sie beim Kompilieren oder Laden einfach in einer Datenbank / einem Dateisystem analysieren und speichern können Zeit. Dies bedeutet, dass Sie Ihren Speichermechanismus aus einer Laune heraus austauschen und das Analyseteil einfach neu schreiben können.

Wie oft soll auf die Daten zugegriffen werden?

Viel Datenzugriff bedeutet viel E / A, es sei denn, Sie haben eine Art Caching-Mechanismus. Datenbanken behalten Strukturen im Speicher und eignen sich hervorragend zum Manipulieren und Abrufen von Daten. Wenn Sie wirklich ständig Daten speichern, sollten Sie sich an eine Datenbank halten.

Mehrere Datentypen für eine Anwendung

Das Volumen ist sicherlich eine Überlegung, aber wenn Sie nicht über das Bestehen von Tausenden oder Millionen von Objekten sprechen, wird das Dateisystem als Lösung immer noch akzeptabel sein.

Spiel Typ

Die Art des Spiels, das Sie erstellen, kann einen großen Einfluss auf die von Ihnen gewählte Plattform haben. Ja, für die meisten Nur-Client-Einzelspieler-Spiele ist die Verwendung einer komprimierten oder verschlüsselten Lösung auf Dateisystembasis in Ordnung. Wenn Sie jedoch über Spiele mit einer Online-Komponente sprechen, wäre das verrückt. Gehen Sie die Datenbank Route und sparen Sie sich die Kopfschmerzen. Lassen Sie den Server alle Ihre Daten mithilfe eines Back-End-Clusters verwalten.

Hoffe, einige dieser Rückmeldungen helfen. Es ist keineswegs vollständig, und die Entscheidung liegt letztendlich bei Ihnen, aber mein Kommentar sollte Ihnen einige Denkanstöße geben.

EDIT: Es gibt Zeiten, in denen ein hybdrid-Ansatz sehr sinnvoll ist. Angenommen, Sie entwickeln ein MMORPG. Auf der Clientseite können Sie zwischengespeicherte Daten zu anderen Spielern in einer nicht relationalen Datenbank speichern (wie oben erwähnt). Auf der Serverseite speichern Sie alle Spieldaten in einer relationalen Datenbank, um sie beizubehalten. Und auf der Clientseite speichern Sie wahrscheinlich Protokolldaten, Konfigurationsdaten usw. in XML- / Flat-Dateien, um den Zugriff zu vereinfachen.

Ein anderes Poster erwähnte auch, dass es manchmal schön ist, auch wenn Sie Daten für die Produktion in einer Datenbank speichern, eine Möglichkeit zu haben, stattdessen flache Dateien für die Entwicklung zu verwenden. Es kann einfach einfacher sein, ein anderes Produkt aus dem Mix zu entfernen .

Ed Altorfer
quelle
+1 Tolle Antwort, und ich lerne schon viel daraus. Deshalb hasse ich es, das zu tun, aber es gibt ein paar Punkte, die nicht richtig angesprochen wurden. und das liegt höchstwahrscheinlich daran, dass ich sie nicht ausreichend ausdrücken konnte. 1) Kleiner Punkt, aber als ich über Plattform sprach, sprach ich tatsächlich über Entwicklungsplattform. Aber Sie haben diesen Punkt trotzdem angesprochen. 2) Mit Portabilität meine ich Wiederverwendbarkeit, aber Ihr Punkt zur Portabilität war tatsächlich ein Punkt, den ich nicht berücksichtigt hatte, der sich jedoch als ziemlich relevant erwies. (-> Fortsetzung)
Eldros
3) Bei der Adressierung mehrerer Datentypen für dieselbe Anwendung haben Sie nicht über die Verwendung einer Kombination von Datenspeichern gesprochen, die jeweils ihre Aufgabe haben. Aber ich gehe davon aus, dass ich die Rolle jeder Art von Daten separat betrachten muss. 4) Ich habe gehört, dass es neben der Einfachdatei und der relationalen Datenbank noch eine andere Art der Datenspeicherung gibt, die ich auch gerne kennen würde, wie im OP dargelegt. Jetzt werde ich das OP entsprechend bearbeiten, um das zu reflektieren, was ich in diesen Kommentaren gesagt habe.
Eldros
Aktualisiert. Hoffe, dies beantwortet Ihre Fragen. :)
Ed Altorfer
1

In letzter Zeit wurde ich durch die Starrheit / Schwierigkeit des Hinzufügens zu relationalen Datenbanken eingeschränkt. Ich würde gerne dokumentbasierte Datenbanken (z. B. couchdb) untersuchen, da diese für Spiele, Status und Flexibilität sehr geeignet zu sein scheinen. Es ist jedoch nicht sehr praktisch, mehrere Datenbanktypen für ein kleines Projekt einzurichten. Aus diesem Grund habe ich einen Hack eingerichtet, der der Verwendung eines binären Blob-Felds in bestimmten Feldern der Datenbank ähnelt.

Ich verwende json-codierte Daten in der Datenbank und einen Wrapper, der die Daten in json konvertiert und bei Bedarf zurücksetzt. Ein grundlegendes Charakterprofil könnte in der Datenbank also so aussehen:

{"char_id":24,"char_name":"tchalvak","level":43,"profile":"Some profile here."}

Json ist in der Datenbank immer noch gut lesbar. Wenn Sie also mit SQL-Code arbeiten und manchmal auch direkt auf die Datenbank zugreifen, können Sie diese manuell ändern, wenn Sie möchten.

Nun, all das ist ein Hack, und ich rate nicht, es zu kopieren, aber hier ist der allgemeine Punkt: Verlassen Sie sich nicht nur auf ein System. Verwenden Sie eine relationale Datenbank und fummeln Sie das System. Oder verwenden Sie zwei verschiedene Arten von Datenspeichersystemen (z. B. Flat File und relationale Datenbank?), Damit Sie den größten Nutzen aus beiden ziehen können. Unabhängig davon, was die Leute vorschlagen oder mit welchem ​​System Sie arbeiten, werden Sie Umstände finden, unter denen ein anderer Ansatz besser funktionieren würde. Seien Sie also bereit, eine Alternative hinzuzufügen und zu sehen, wohin er Sie führt.

Kzqai
quelle
0

Im RTS-Gen wurden Spieldaten in Dateien gespeichert.

Die Einheiten und Attribute wurden in INI- oder XML-Dateien oder anderen textbasierten Formaten gespeichert, und die Modelle waren eine Mischung aus binären oder sogar textbasierten Formaten und den Texturen und Sounds sowie anderen Medien in Mainstream-Formaten. Manchmal befand es sich in einem Container, der eine grobe Verschlüsselung aufweist - man denke an Westwoods Mischformat. Dies ist jedoch meistens eine Verschleierung - wenn Sie in diese hineinschauen, handelt es sich lediglich um normale Dateien in einfach zu handhabenden Formaten.

Mit dem Aufkommen des Online-Spiels wird es immer häufiger, dass die Spieldaten nach der Installation über das Internet bereitgestellt werden, obwohl diese häufig noch im Dateisystem gespeichert sind.

Wille
quelle
Dies ist bei "AI war" (Website down atm) nicht der Fall. Er verwendet eine relationale Datenbank, damit die KI bei der Entscheidung über das Verhalten Linq-Abfragen durchführen kann.
Nagler
0

Warum eine Methode zur Datenspeicherung verwenden?

In den meisten Fällen benötigt das Spiel, das Sie der Welt zur Verfügung stellen, nicht die gleiche Datenspeicherfunktion, die das Spiel während der Entwicklung benötigt.

Hier ist ein Vergleich einiger Release- / Entwicklungsanforderungen:

Requirement      |  Release  |  Development  |  QA
==================================================
Multi user       |    No     |      Yes      |  No
Writable         |    No     |      Yes      |  No
Revision Control |    No     |      Yes      | Yes (but only reading)
Compact          |   Yes     |       No      |  No
Fast             |   Yes     |       No      |  No

Idealerweise definieren Sie dann eine Schnittstelle zu Ihrem Datenlademodul und erstellen dann mehrere Versionen, die jeweils auf bestimmte Anforderungen zugeschnitten sind.

Bei einem Projekt, an dem ich vor vielen Jahren gearbeitet habe, dauerte das Laden von Level-Daten von einer CD viel zu lange (Off-HD war auch nicht großartig). Also habe ich mir folgendes ausgedacht. Ich hatte drei Methoden zum Laden von Level-Daten:

  1. Normales Laden - für die Entwicklungszeit, als sich die Assets geändert haben
  2. Pre-Release - effektiv eine Methode, um normale Daten in schnell ladende Daten umzuwandeln
  3. Release - nur schnelle Daten (nicht editierbar)

Dies reduzierte die Ladezeiten von Minuten auf Sekunden.

Skizz
quelle