Wäre es besser, XML / JSON / Text oder eine Datenbank zum Speichern von Spielinhalten zu verwenden?

29

Ich überlege, wie ein komponentenbasiertes Spiel implementiert werden soll, da dies sehr aktuell zu sein scheint und ich die Idee eines so flexiblen Designs mag. Eines der Merkmale eines solchen Designs ist, dass das Hinzufügen neuer Elemente zum Spiel über Daten erfolgen kann, die häufig als Laden von Inhalten über Textdateien wie XML dargestellt werden. Dies hat den Vorteil, dass es in jedem Texteditor lesbar und leicht zu bearbeiten ist. Auf der anderen Seite kann der Umgang mit Text langsamer sein, und Sie müssen eine große Sammlung von Datendateien verwalten. Ähnliche textbasierte Formate wie JSON oder Konfigurationsdateien hätten ähnliche Vorteile.

Auf der anderen Seite gibt es kleine, portable Datenbanken wie SQLite oder Tokyo Cabinet. Obwohl diese Dateien nicht direkt von Menschen gelesen werden können, sind sie einfach zu bedienen, und ich würde mir vorstellen, dass eine Art Bearbeitungswerkzeug für die Gestaltung von Spielinhalten sowieso vorzuziehen ist. Die Verwendung einer Datenbank ermöglicht das konsistente Speichern von Konfigurationsinformationen und das einfache Abrufen. Sie können auch Daten in eine Datenbank serialisieren, um Spiele zu speichern.

In Bezug auf die Leistung denke ich, dass XML im Allgemeinen für kleine Dateien schneller ist, eine Datenbank jedoch für große Datenmengen besser skalierbar ist. Ich würde mir vorstellen, dass jedes echte Spiel eine Menge Spielobjekte haben wird.

Also die Frage: Welcher Ansatz ist vorzuziehen? Ich neige zur DB, aber ich möchte wissen, ob Textdateien versteckte Fallstricke oder wirkliche Vorteile haben. Oder wenn es noch andere Alternativen gibt (ich schätze, Serialisierung auf Binärformat)

CodexArcanum
quelle

Antworten:

18

Für ein kleines persönliches Spiel ist es vielleicht nicht so weit gekommen, aber ein schweres Problem bei den Spieldaten ist die Bearbeitung / Versionierung für mehrere Benutzer. Wir verwenden viele kleine Textdateien, die durch einen Erstellungsprozess auf eine kleine Anzahl von binären Blobs heruntergebrannt werden. Dies erleichtert Designern das Leben, da sie in ihrem Arbeitsablauf sehr flexibel sind. CCP verwendet als Gegenbeispiel eine zentrale Bearbeitungsdatenbank, mit der sich alle Designer verbinden. Dies macht den Build-Schritt unnötig (oder zumindest viel einfacher), aber es bedeutet, dass Sie alle Versions- und Workflow-Funktionen selbst implementieren müssen, damit sie einfacher sind als andere Tools auf dem Markt. In beiden Fällen können Sie sich mit der Leistung befassen. Die eigentliche Frage ist also, was Sie für einen Designer-Workflow wünschen und wie Sie dorthin gelangen können.

coderanger
quelle
Das ist ein ausgezeichneter Punkt. Ich hatte den Mehrpersonen-Workflow noch die Versionskontrolle nicht zu genau betrachtet. Beides sind sehr gute Argumente für Textdateien, zumindest als Quelldokument. Einfachere Werkzeugunterstützung. Danke für diese Perspektive!
CodexArcanum
Es ist ziemlich einfach, eine Datenbank auch in XML zu exportieren. Mit nur ein wenig Vorausplanung können Sie Ihren Komponentenlader als Schnittstelle schreiben - schließen Sie dann einfach entweder den Datenbank- oder den XML-Dateireader an. Beim Erstellen von Komponenten kann eine Datenbank einfacher sein, da für alle Datenmanipulationen vorgefertigte GUIs zur Verfügung stehen, anstatt mehrere Dateien zu bearbeiten. Speichern Sie dann im abschließenden Build-Prozess die Datenbank in XML, backen Sie sie in Binärdateien usw., und die Produktionsversion des Spiels verwendet nur den entsprechenden Loader.
Nachsicht
1
Wie würde das helfen? Wenn Sie einen benutzerdefinierten Editor verwenden und dann in Textdateien ausgeben, erhalten Sie die schlechtesten Teile jeder Option:
P
7

JSON ist sehr leicht und leicht zu verstehen. Ich denke, es ist besser für ein Spiel geeignet. cJSON ist wirklich nett. Ebenso wie SQLlite wird es in Ihre Quelle integriert.

XML-Dateien sind für Benutzer schwieriger zu bearbeiten, als Sie vielleicht denken. Wenn Sie diesen Weg gehen, möchten Sie möglicherweise einen Editor erstellen, mit dem die Benutzer häufige Fallstricke vermeiden können.

Dr. McKay
quelle
Ich habe mir JSON wirklich noch nie so genau angesehen, da ich mit XML zufrieden war (wie viel einfacher könnte es wirklich sein). Es stellt sich heraus, dass JSON ziemlich erstaunlich ist data heavy
Spooks
7

Ich bin zu spät zur Party hier, aber ich habe eine Menge Zeit damit verbracht, dies zu recherchieren.

Erstens, warum ich das Folgende nicht benutze:

XML: Übermäßig ausführlich. Tonnenweise Redundanz. Feldnamen wiederholen? BRUTTO

JSON: Ich denke, JSON ist großartig für ein UI-Layout, aber für eine Datenbank, verdammt nein. Es wird die gleichen Probleme wie XML, Redundanz und Deep Nesting haben. BRUTTO.

SQL : Dies ist eine großartige Option, wenn Sie die Probleme beim Einrichten in den Griff bekommen. Ich habe mobile Spiele erstellt, in denen wir die Spieldaten online in einer SQL-Datenbank speichern. Das Tabellenformat ist schön. Das Problem war, dass wir die Datenbank online abrufen mussten und das Einrichten ein Problem sein kann. Aber SQL ist eine anständige Lösung. Unity unterstützt dies nicht von Haus aus, und die Plugins, die ich ausprobiert habe, hatten schwerwiegende Probleme (insbesondere, wenn versucht wurde, sie mit der Versionskontrolle zum Laufen zu bringen).

Schließlich ist hier die Lösung, für die ich mich entschieden habe (und die ich liebe).

CSV : Einfach. Ermöglicht die Verwendung des Tabellenformats, und ich habe einen einfachen Bezugspunkt, wenn ich es aktualisieren muss. Ich kann eine Tabelle für alle meine Waffen, Spalten für alle Attribute und Zeilen für jeden Waffentyp haben.

Sie können Microsoft Excel verwenden, aber es gibt diese dummen Warnungen jedes Mal aus, wenn Sie speichern müssen. Sie können Makros verwenden, um sie zu überschreiben, aber ich sage, sparen Sie sich die Mühe und holen Sie sich LibreOffice . Es ist kostenlos und unterstützt die CSV-Bearbeitung. Wenn Sie die Datei öffnen, wird die Spaltenbreite entsprechend dem Namen geladen (Excel tut dies nicht und hat mich verrückt gemacht).

Dann müssen Sie nur noch die CSV-Dateien in Ihrem Spiel analysieren. Ich benutze Unity, also musste ich nur diesen raffinierten C # CSV-Parser verwenden, den ich gefunden habe:

CSV-Parser-Beispiel

Sie konvertieren die CSV-Dateien in Ihre In-Game-Datenobjekte und können loslegen. Mit Unity können Sie diese in ScriptableObjects umwandeln . Mein Workflow ist also: CSV aktualisieren -> CSV in skriptfähige Objekte analysieren -> Daten aus ScriptableObjects für mein Spiel verwenden

Aggressor
quelle
6

Die Antwort darauf hängt davon ab, welche Sprache Sie für das Spiel verwenden.

Wenn Sie C ++ verwenden, ist es ratsam, eine der vorhandenen XML-Bibliotheken (wie TinyXml oder eXpat ) zu verwenden.

Wenn Sie dagegen PHP verwenden, können Sie sehr leicht einen Datenbankserver wie MySQL oder SQLite verwenden. (Beachten Sie, dass Sie auf diesem Weg mehr Ressourcen benötigen, da der Datenbankserver als separater Prozess ausgeführt wird und größere Datenbankanwendungen wie MySQL beim Ausführen viel RAM verbrauchen können.)

JSON gewinnt an Dynamik und ist mit Sicherheit die beste Wahl, wenn Ihre Anwendung in mehr als einer Sprache geschrieben ist.

Kurz gesagt, es kommt darauf an, was in Ihrer Sprache leicht zu gebrauchen ist.

George Edison
quelle
1
Was ist ein Problem, um eine DB aus C ++ zu verwenden?
Budda
2

Wenn Sie im XML-Bereich bleiben möchten, können Sie Binär-XML verwenden , um die Ladeleistung zu verbessern.

Zum Beispiel ist Fast Infoset eine Implementierung von Binär-XML

Man kann sich Fast Infoset als gzip für XML vorstellen, obwohl FI sowohl die Dokumentgröße als auch die Verarbeitungsleistung optimieren möchte, während gzip nur die Größe optimiert. Während die ursprüngliche Formatierung verloren geht, gehen bei der Konvertierung von XML nach FI und zurück nach XML keine Informationen verloren.

David Young
quelle
Obwohl ich wahrscheinlich nichts verwenden würde (ich neige zu JSON über XML), schätze ich die Links.
CodexArcanum
1

Ich habe Datenbanken entworfen und seit Jahren mit vielen Spielideen gespielt. Mein persönlicher Favorit im Moment ist ein textbasiertes, von Menschen lesbares Format für Konfigurationen, das diese "langsamen Skripte" jedoch in etwas ausführbareres zerlegt. Ähnlich wie JAVA und .NET wird es in Runtime-Bytecode kompiliert.

Die gleiche Idee geht hier. Ich habe eine "Quell" -Version von Komponenten und dann läuft ein Pre-Compiler / Parser durch diese. Wenn sie zu viel Speicherplatz beanspruchen, können Sie sie in eine schnelle SQL-Datenbank schreiben oder als Binärdateien speichern. Mein Punkt ist jedoch, den Speicher oder die SQL-Datenbank als Arbeitsbereich / Cache zu verwenden, damit Sie die Skripte nicht immer wieder analysieren müssen. Sie können den Compiler erstellen, die analysierten Dateien in eine "Source-Lib" verschieben und auf diese Weise den Precompiler auch die Versionierung durchführen lassen (wobei die vorherigen Dateien für Rollback-Zwecke beibehalten werden).

Wenn es um "unbegrenzten Festplattenspeicher" geht, melden Sie sich bei Dropbox oder Amazon S3 an und synchronisieren Sie sie.

So ist der Plan für mich derzeit:

  1. Config / scripts / xml (etwas lesbares Format) als Textdateien (genau wie Quellcode)
  2. Parser / Validator, der neue Skripte durchläuft und überprüft, ob sie den Regeln entsprechen
  3. Compiler, der aus den Originaldateien Binär- oder SQL-Zeilen erstellt, sodass diese schnell abrufbar und schnell ausführbar sind.

In Bezug auf die Stabilität baue ich die Datenbank derzeit so auf, dass sie von mehreren Standorten gleichzeitig gehostet und automatisch synchronisiert wird, sodass bei einem Netzwerk- / Hardwarefehler an einem Standort die anderen Standorte in der Lage sein sollten, denselben Datenverkehr zu verarbeiten. Gamestates.

BerggreenDK
quelle
Interessante Lösung, vor allem angesichts der Tatsache, wie viel Cloud-Hosting seit dem Verfassen Ihrer Antwort zugenommen hat.
Rideoutcolin
1

Wenn Sie couchdb verwenden, speichern Sie im Wesentlichen alles als JSON-Struktur. Couchdb wird sich mehr oder weniger schmerzlos darum kümmern, die Daten Ihrer (mehreren) Benutzer zu replizieren.

egarcia
quelle
0

Sie finden eine Prozedur in Unity Wiki mit PHP, MySQL und C # / JavaScript, die für ihren Zweck gut funktioniert.

Es besteht aus drei Schritten

  1. Erstellen Sie eine leere MySQL-Datenbank und eine Tabelle.
  2. Erstellen Sie ein serverseitiges PHP-Skript (dies stellt eine Verbindung zur MySQL-Tabelle her, empfängt Daten von einem Unity-Skript (Schritt 3) und fragt die Datenbank ab (die angegebenen Beispiele sind entweder das Einfügen von Daten oder das Auswählen von Daten).
  3. Erstellen Sie das Unity Controller-Skript. (Dies stellt eine Verbindung zu dem in Schritt 2 erstellten PHP-Skript her.)
Tiago unterstützt GoFundMonica
quelle