Ich habe ein Online-Spiel, in dem die Spieler die Welt auf irgendeine Weise gestalten können - z. Das Gehäuse von Ultima Online, in dem Sie Ihre Häuser direkt auf bestimmten Teilen der Weltkarte bauen können. Dies sind Veränderungen, die im Laufe der Zeit als Teil der beständigen Welt fortbestehen sollten.
Gleichzeitig fügt das Designteam neue Inhalte hinzu und ändert alte Inhalte, um das Spiel für neue Spieler zu verbessern und zu erweitern. Sie tun dies zuerst während des Testens auf einem Entwicklungsserver und müssen dann später ihre Arbeit mit der "Arbeit" der Spieler auf dem Live-Server zusammenführen.
Angenommen, wir beheben die Probleme mit dem Spieldesign - z. Spieler können nur in bestimmten Bereichen bauen, sodass sie niemals geografisch mit Designer-Bearbeitungen in Konflikt geraten. Was sind gute Möglichkeiten, um mit den Daten umzugehen oder die Datenstrukturen so anzuordnen, dass Konflikte vermieden werden, wenn neue Designer-Daten mit neuen Player-Daten zusammengeführt werden?
Beispiel 1: Ein Spieler stellt einen neuen Gegenstandstyp her und das Spiel weist ihm die ID 123456 zu. Alle Exemplare dieses Gegenstands beziehen sich auf 123456. Stellen Sie sich nun vor, die Spieleentwickler haben ein ähnliches System, und ein Entwickler erstellt einen neuen Gegenstand mit der Nummer 123456. Wie kann dies vermieden werden?
Beispiel 2: Jemand macht einen beliebten Mod, der all Ihren Drachen einen französischen Akzent verleiht. Es enthält ein Skript mit einem neuen Objekt namens, mit assignFrenchAccent
dem die neuen Sprachelemente jedem Drachenobjekt zugewiesen werden. Aber Sie sind dabei, Ihren "Napoleon vs Smaug" -DLC bereitzustellen, der ein Objekt mit dem gleichen Namen hat - wie können Sie dies ohne viele Kundendienstprobleme tun?
Ich habe mir folgende Strategien überlegt:
- Sie können 2 separate Dateien / Verzeichnisse / Datenbanken verwenden, aber dann sind Ihre Lesevorgänge erheblich kompliziert. "Show All Items" muss einen Lesevorgang in der Designer-Datenbank und einen Lesevorgang in der Player-Datenbank ausführen (und muss trotzdem irgendwie zwischen den beiden unterscheiden.)
- Sie können 2 verschiedene Namespaces in einem Geschäft verwenden, z. Das Verwenden von Zeichenfolgen als Primärschlüssel und das Präfixieren mit "DESIGN:" oder "PLAYER:", das Erstellen dieser Namespaces ist jedoch möglicherweise nicht trivial und die Abhängigkeiten sind nicht klar. (In einem RDBMS können Sie möglicherweise Zeichenfolgen nicht effizient als Primärschlüssel verwenden. Sie können Ganzzahlen verwenden und alle Primärschlüssel unter einer bestimmten Zahl, z. B. 1 Million, als Designdaten und alle darüber liegenden Werte zuweisen Spielerdaten. Diese Informationen sind jedoch für das RDBMS nicht sichtbar, und Fremdschlüsselverknüpfungen überschreiten die „Kluft“.
- Sie können immer in Echtzeit an derselben gemeinsam genutzten Datenbank arbeiten, die Leistung ist jedoch möglicherweise schlecht und das Risiko einer Beschädigung der Spielerdaten ist möglicherweise erhöht. Es gilt auch nicht für Spiele, die auf mehr als einem Server mit unterschiedlichen Weltdaten ausgeführt werden.
- ... noch andere Ideen?
Mir fällt ein, dass dies zwar in erster Linie ein Problem für Online-Spiele ist, die Konzepte jedoch möglicherweise auch für Modding gelten, bei dem die Community Mods zur gleichen Zeit erstellt, in der die Entwickler ihr Spiel patchen. Werden hier Strategien angewendet, um die Wahrscheinlichkeit des Abbrechens von Mods zu verringern, wenn neue Patches veröffentlicht werden?
Ich habe dies auch als "Versionskontrolle" getaggt, da dies auf einer Ebene genau das ist - zwei Zweige der Datenentwicklung, die zusammengeführt werden müssen. Vielleicht könnten einige Erkenntnisse aus dieser Richtung kommen.
BEARBEITEN - Einige Beispiele wurden hinzugefügt, um das Problem zu klären. Ich beginne zu glauben, dass es sich wirklich um einen Namensraum handelt, der über zusammengesetzte Schlüssel in einem Geschäft implementiert werden könnte. Das vereinfacht zumindest die Merge-Strategie. Aber es kann Alternativen geben, die ich nicht sehe.