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)
quelle
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.
quelle
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
quelle
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.
quelle
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
quelle
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:
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.
quelle
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.
quelle
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
quelle