Schreiben die Leute aus irgendeinem Grund ihre eigene DB?
Wir haben es getan, hoffentlich wird Ben Z die Gründe besser erklären als ich, da er tatsächlich der ursprüngliche Autor unserer Datenbank war. Die kurze Version ist, dass relationale DBs für Spiele nicht sehr nützlich sind, da sie stark strukturierte hierarchische Daten nicht effizient speichern können. Dies macht die große Mehrheit der Daten aus, die ein MMO für den normalen Betrieb benötigt. Wir entscheiden uns für die Erstellung einer benutzerdefinierten Objektdatenbank und eines Teils eines verteilten Transaktionsverarbeitungssystems, das derzeit in Produktion ist und unsere beiden Live-Spiele unterstützt.
Was ist, wenn Sie das Gleiche tun sollten? Wahrscheinlich nicht, zumindest zunächst nicht. Ich würde immer noch befürworten, SQL zu vermeiden, aber es gibt jetzt viel mehr Optionen in der "NoSQL" -Welt, die es vor ein paar Jahren noch nicht gab.
Die meisten MMOs werden jedoch in relationalen SQL-Datenbanken ausgeführt. Ich weiß, dass Eva auf einer SQL Server-Installation läuft, die auf ein paar Multi-TB-RAMSANs aufbaut (ich werde wahrscheinlich nie in meinem Leben so viel Geld haben, wie diese Dinge kosten).
EDIT: Hoffentlich macht es ihm nichts aus, dass ich das hier poste , aber dies ist ein Blogeintrag mit einigen Links und Kommentaren zu der Präsentation, die wir auf der GDC'08 über unsere Datenbank gehalten haben.
Okay, diese Antwort ist eher eine Beobachtung.
Vollständige Offenlegung Ich habe nicht an MMORPG gearbeitet. Ich habe auf einer der 10 meistbesuchten Websites im Jahr 2009 gearbeitet, und ich habe bei einer Game-Engine-Firma gearbeitet, die glaubte, sie hätten MMORPG-Technologie entwickelt (ich weiß nicht, ob sie ausgeliefert wurde).
Wenn man sich Unternehmen ansieht, die ein enormes Ausmaß erreicht haben (Google, Facebook, Twitter usw.), weiß ich, dass es sich nicht um Spielefirmen handelt, aber es lohnt sich, sie in diesem Bereich zu betrachten. Ich halte zwei Dinge für wichtig.
Ein großer Fehler ist, sich ein teures, schlüsselfertiges Produkt zu schnappen und es auf magische Weise für Sie zu skalieren. So funktioniert das nicht. Der Schlüssel zur Skalierung liegt im angemessenen Umgang mit jeder neuen Herausforderung. Sie benötigen flexible, benutzerfreundliche Lösungen, die Sie problemlos ein- und ausziehen können.
Mein Rat an Sie wäre also, wenn Sie anfangen, nur das zu tun, was Ihnen am wenigsten Kopfzerbrechen bereitet.
quelle
Grundsätzlich gibt es eine ganze Reihe von Ansätzen, und ich denke, sie basieren eher auf den Erfahrungen ihrer Entwickler als auf den Eigenschaften der Datenbank. An einem Ende verwenden viele MMOs relationale Standarddatenbanken - z. Dark Ages of Camelot benutzt / benutzt (gehen sie noch?) MySQL , FreeRealms benutzen ein modifiziertes Postgresql , etc.
Wenn Sie sich auf der Skala bewegen, haben Sie Guild Wars: Sie verwenden SQL Server , aber sie speichern ihre Daten dort als einzelnes BLOB. Dies bedeutet, dass sie die Vorteile ihrer üblichen Binärformate mit einigen der Vorteile, die eine Datenbank bietet, nutzen können. Natürlich werden Sie auch einige Nachteile dieses Ansatzes bemerken, aber für ein Unternehmen, das daran gewöhnt ist, mit Einfachdateien zu arbeiten, ist dies wahrscheinlich immer noch ein Schritt nach oben.
Dann gibt es wahrscheinlich einige Stellen, an denen die verschiedenen formalisierten NoSQL-Ansätze zum Einsatz kommen, obwohl es noch sehr früh ist. Farmville verwendet Membase , die sie zu diesem Zweck erstellt haben, basierend auf anscheinend memcached. Dies teilt viele Funktionen mit MongoDB, CouchDB usw. Mit diesen Ansätzen rollen Sie normalerweise Ihre eigenen Speicherformate, erhalten jedoch die Vorteile der Verteilung, Zwischenspeicherung, Redundanz usw.
Einige rollen ihr eigenes NoSQL vollständig: Cryptic sagte, sie hätten etwas Ähnliches getan, aber sie hätten es auch nicht in der Produktion verwendet. ( BEARBEITEN : aber siehe Kommentare unten.)
Und dann kommen Sie zu Leuten, die Flachtext oder Binärdateien verwenden - wie ich es verstehe, haben ältere Spiele wie Ultima Online, Everquest usw. diesen Weg eingeschlagen, und für ein Unternehmen mit Erfahrung in der Spieleentwicklung, aber wenig Datenbankerfahrung funktioniert dies gut zu.
Beachten Sie auch, dass Sie fast nie darum herumkommen, Ihre eigene Datenbank im eigentlichen Sinne zu schreiben - in Spielen haben Sie immer maßgeschneiderte Daten, die Sie entweder im Arbeitsspeicher oder auf der Festplatte auf eine Weise verwalten müssen, die sich nicht anbieten zu generischer Software. Sie können SQL-Abfragen nicht jedes Mal ausführen, wenn Sie Daten benötigen, sodass Sie viele Ihrer Informationen im Code spiegeln müssen, unabhängig davon, welches Back-End Sie verwenden.
quelle
Bei Pirates of the Burning Sea haben wir auf MySQL gestarrt (obwohl ich Postgres ehrlich gesagt vorgezogen hätte), und als es unter Last herunterfiel, sind wir auf Microsoft SQL Server umgestiegen. Ehrlich gesagt, werde ich diesen Weg in Zukunft wahrscheinlich nicht mehr gehen. Die meisten PotBS-Daten werden vorab serialisiert, bevor sie ohnehin beibehalten werden. Ein großer Teil des Inhalts der Datenbank ist also nichts anderes als ein überzähliger Schlüssel- / Wertspeicher. Darüber hinaus haben wir einen Caching-Server erstellt, der sich vor der Datenbank befand, um eine bessere Leistung unserer Persistenzschicht und eine bessere Kontrolle darüber, wie Daten im Speicher zwischengespeichert wurden, zu erzielen.
Kylotan hat also vollkommen recht, Sie werden es nicht schaffen, Ihr eigenes auf irgendeiner Ebene zu rollen. Relationale SQL-Datenbankserver sind nicht für die Art und Weise konzipiert, wie Spiele Daten verwenden. Anstatt davon auszugehen, dass relationale DB-Server das Ende aller Datenbanken darstellen, hätten wir uns vor der Auswahl eines Tools mehr Gedanken darüber machen müssen, nach welchen Vorteilen wir gesucht haben.
Das nächste Mal würde ich mich mehr mit BerkleyDB oder anderen NoSQL-ähnlichen DBs befassen.
quelle
Eine andere Sache zu beachten ist, dass wenn Sie einen (relativ) statischen Datensatz haben, speichern Sie ihn nicht in einer Datenbank! Es gibt keinen wirklich guten Grund, Ihre Zauberdefinitionen, Objektdefinitionen, Karten usw. in einer Datenbank zu speichern. Sie fragen sie nur nach Namen ab. Ich sehe eine Menge Leute, die in die Spieleentwicklung einsteigen und diese Dinge zusammen mit beständigen Spielerdaten speichern, und es ist eine ganz andere Klasse von Dingen.
Hierfür benötigen Sie einen Datenspeicher wie ein Dateisystem. Außerhalb der Entwicklung brauchen Sie keine ACID, Sie brauchen kein CRUD, Sie brauchen keine Datenbank für diese Art von Daten. Innerhalb der Entwicklung benötigen Sie eine Datenbank, aber Sie benötigen trotzdem ein VCS, und Ihre Wahl des VCS wird diese Wahl der Datenbank für Sie treffen.
(Wenn Sie an einem Spiel arbeiten, in dem Spieler benutzerdefinierte Zaubersprüche, Gegenstände oder Quests erstellen können, sind diese Daten mit den Spielerdaten identisch und Sie benötigen erneut eine Datenbank.)
quelle
MMORPGs sind intensive Apps und ein großes Unterfangen. Wenn Sie mit der Spieleentwicklung beginnen, empfehle ich Ihnen dringend, etwas kleineres zu machen.
Das heißt, Sie benötigen zwei Squeeze Top-Performance aus Ihrem Setup. Offensichtlich benötigen Sie eine Serverfarm / -struktur. Da die Netzwerkkommunikation relativ teuer ist (und die meisten MMORPGs in Echtzeit ablaufen), möchten Sie möglicherweise Ihre zentrale Datenbank auf jeden Ihrer Spieleserver replizieren (dies entspricht einer Echtzeit-Replikation mit geringer Latenz in der Datenbank Ihrer Wahl).
Wenn jeder Ihrer Server ein bestimmtes Segment der Spielwelt bedient (wie WoW funktioniert); so etwas wie Distributed Partitioned Views . Mit DPVs können Sie Zeilen Ihrer Datenbank über verschiedene Server hinweg segmentieren. gemäß den Einschränkungen für die Spalten auf jedem Server. Sowohl MSSQL als auch Oracle sind intelligent genug, um nur mit dem Server zu kommunizieren, der die Daten enthält, die in Ihre WHERE- oder ON-Klausel fallen. Ich bin mir nicht sicher, ob eines der Open Source-Angebote DPVs enthält.
Das Nettoergebnis davon ist, dass es keine Rolle spielt, welche Datenbank Sie verwenden , sondern nur eine mit einem guten Namen: MSSQL, Oracle, MySQL, PostgreSQL. Schreiben Sie Ihre Datenbank in ANSI SQL und finden Sie heraus, welches System am besten funktioniert. Nur so können Sie es herausfinden.
Die NoSQL-Route ist möglicherweise auch eine gute Idee, da sie für hohe Parallelität ausgelegt ist. Prannys Vorschlag könnte den Trick machen.
quelle
Ich habe MongoDB (NoSQL) verwendet, ein sehr schneller Dokumentenspeicher, auf den über TCP zugegriffen werden kann. Versuche es! Es ist toll!
Das Schreiben einer eigenen Datenbank ist eine entmutigende Aufgabe. Ich schlage vor, dass Sie zuerst untersuchen, was bereits da draußen ist, und wenn Sie nichts finden, das Ihren spezifischen Kriterien entspricht, bauen Sie Ihr eigenes. Oh, und vergiss nicht, es als Open Source zu veröffentlichen. :)
quelle
Ich denke, es hängt ziemlich stark davon ab, welche Art von Daten Sie speichern müssen und in welcher Form.
Ich denke, die meisten Leute da draußen verwenden "Standard" -SQL-Datenbanken für "dynamische" Daten wie Spielerinformationen, sei es SQL Server, MySQL, PostgreSQL.
"Interne" Daten (Weltzustand, Inhalt, ...) können jedoch in jeder Form gespeichert werden, und ich gehe davon aus, dass die meisten Unternehmen zumindest teilweise benutzerdefinierte Datenbanksysteme für diesen Teil schreiben, die für ihre spezifischen Anforderungen geeignet sind .
quelle
Nun, es hängt tatsächlich von Ihrer Anwendung ab - das ist die Quintessenz. Ich arbeite, wo wir soziale Rollenspiele entwickeln und Google App Engine als Backend verwenden
quelle
Diese Frage ist ziemlich alt, aber meine Vorstellung, wie ich damit umgehen soll, ist genauso gültig, wie sie gestellt wurde, wie sie heute ist.
Wenn Sie eine relationale Datenbank verwenden, müssen Sie die Belastung verringern, damit diese Idee hilfreich ist.
Speichern Sie alle öffentlichen Informationen in einer lokalen Datenbank auf jedem Client-System sowie in der Server-Datenbank.
Speichern Sie alle Tabellen mit Elementen in der Client-Datenbank. Anstatt dass der Client auf den Server schaut, wenn Sie mit der Maus über diese Waffe nach Statistiken fahren, überprüft der Client nur die lokale Datenbank auf Statistiken. Der Server verfügt über eine eigene Datenbank zum Abrufen von Statistiken bei der Berechnung und zum Weiterleiten von verbleibendem Schaden und Gesundheit an die Clients.
Das Schlimmste an dieser Idee ist, dass jeder die Statistiken zu allen Waffen sehen kann, wenn er es schafft, in die Client-Datenbank zu gelangen. Es spielt jedoch keine Rolle, denn selbst wenn sie die Werte ändern, sind die Datenbankwerte auf dem Server das, was im Spiel berechnet wird.
quelle