Sollte ich eine SQL-Datenbank verwenden, um Daten in einem Desktop-Spiel zu speichern? [geschlossen]

9

Entwicklung einer Game Engine

Ich plane ein Computerspiel und seine Engine. Es wird eine dreidimensionale Welt mit First-Person-Ansicht geben und es wird vorerst Einzelspieler sein. Die Programmiersprache ist C ++ und verwendet OpenGL.

Datenzentrierte Entwurfsentscheidung

Meine Entwurfsentscheidung besteht darin, eine datenzentrierte Architektur zu verwenden, in der es einen globalen Ereignismanager und einen globalen Datenmanager gibt . Es gibt viele Komponenten wie Physik, Eingabe, Sound, Renderer, ai, ... Jede Komponente kann Ereignisse auslösen und abhören . Darüber hinaus kann jede Komponente Daten lesen, bearbeiten, erstellen und entfernen .

Die Frage betrifft den Datenmanager.

Gibt an, ob eine relationale Datenbank verwendet werden soll

Sollte ich eine SQL-Datenbank verwenden, z. B. SQLite oder MySQL, um die Spieldaten zu speichern? Dies enthält praktisch alle Spielinhalte wie Gegenstände, Charaktere, Inventare usw. Mit Ausnahme von Maschen und Texturen, die noch leistungsbezogener sind, werde ich sie im Gedächtnis behalten.

Ist eine SQL-Datenbank schnell genug, um sie zum Lesen und Schreiben von Spielinformationen in Echtzeit zu verwenden, beispielsweise für die Position eines sich bewegenden Charakters? Ich muss mich auch um die plattformübergreifende Kompatibilität kümmern. Welche Alternativen habe ich, abgesehen davon, dass ich alles im Gedächtnis habe?

Vorteile wären

Die Vorteile der Verwendung einer relationalen Datenbank wie MySQL wären die datenorientierte Struktur, die eine schnelle Berechnung ermöglicht. Ich würde keine Objekte zur Darstellung von Entitäten benötigen. Ich könnte leicht Daten von Objekten in der Nähe des Players abfragen, die zum Rendern benötigt werden. Und ich muss mich nicht um Daten von weit entfernten Objekten kümmern. Darüber hinaus wären keine Speicherspiele erforderlich, da der Status des gesamten Spiels in der Datenbank gespeichert ist. Last but not least wäre es relativ einfach, das Spiel zu einem Online-Spiel zu erweitern, da es bereits einen Ort gibt, an dem der Status des gesamten Spiels gespeichert ist.

Danijar
quelle
Möglicherweise möchten Sie Objektdatenbanken gegenüber relationalen Datenbanken in Betracht ziehen, um einige der in der akzeptierten Antwort zu spröden Schemata und dergleichen genannten Probleme zu lösen.
Asche999
Wenn Sie Prozesse haben, die für eine relationale Datenbank besser geeignet sind, können Sie Embedded SQL mit Hybridspeicherzugriff verwenden. Dies würde viele der Probleme umgehen, die herkömmliche SQL-Datenbanken für die Leistungsanforderungen von Spielen ungeeignet machen.
Rovyko

Antworten:

11

Eine SQL-Datenbank ist bei weitem nicht schnell genug, um Spielinformationen in Echtzeit zu lesen und zu schreiben. Solche Daten werden in herkömmlichen Datenstrukturen fast immer gespeichert.

Die Verwendung einer eingebetteten Datenbank wie SQLite für bestimmte Datentypen, z. statische Daten, die sich während des Spiels nicht ändern, sich aber während der Entwicklung ändern. Dies könnte dann als Teil des endgültigen Spiels bereitgestellt werden, bei dem SQLite nur beim erstmaligen Laden des Spiels oder beim Starten eines neuen Levels usw. wirklich verwendet wird.

Es gibt jedoch auch viele Nachteile: Es ist schwierig, einzelne Teile der Daten zu patchen, wenn sie in einer einzigen Datenbankdatei gespeichert sind. Es ist nicht ideal für viele Arten komplexer Daten, die Spiele benötigen (und von denen Sie sagten, dass Sie sie speichern würden) außerhalb - aber es wird Verweise auf und von Dingen innerhalb geben), es ist nicht sehr flexibel, wenn Sie das Schema ändern müssen, es ist nicht unbedingt abwärtskompatibel, nachdem Sie das Schema usw. geändert haben.

Aus diesen Gründen verwenden die meisten Spieleentwickler nur ihr eigenes Format. Professionelle Entwickler, die leistungsbewusst sind, gehen manchmal noch einen Schritt weiter und speichern die speicherinterne Datenstruktur direkt auf der Festplatte, damit sie mit einem Minimum an Verarbeitung geladen werden kann.

Und wenn Sie wirklich textbasierte Tabellendaten benötigen, die leicht bearbeitet werden können, können Sie ein einfaches textbasiertes Format wie CSV, XML, JSON, YAML usw. verwenden.

Kylotan
quelle
2
Am Ende habe ich SQLite zum Speichern des Spielstatus verwendet. Da ich ein Entitätssystem verwende, ist das absolut sinnvoll: Alles, was ich habe, sind Eigenschaften. Jeder Eigenschaftstyp hat seine Tabelle in der Datenbank und Entitäten sind durch ihre (global eindeutige) ID verknüpft. Aber in Vererbungssystemsystemdatenbanken würde das wohl nicht viel Sinn machen.
Danijar
1
Ja, ich denke, die Verwendung von SQLite zum Speichern des Spielstatus ist eine gute Idee, vorausgesetzt, Sie planen dies von Anfang an. Ich möchte jedoch nicht, dass die DB der Hauptort ist, an dem Spieldaten während des Spiels gespeichert werden.
Kylotan
5

Eine Datenbank ist nicht schnell, die Verwendung einer Datenbank ist viel langsamer als der herkömmliche Speicherzugriff. Der Grund ist einfach, eine Datenbank ist dynamisch, mit ihr ist eine Menge Overhead verbunden, die Abfragen müssen analysiert werden, Hashes müssen berechnet werden und andere Dinge.

Es gibt nur einen Vorteil bei der Verwendung einer Datenbank, nämlich die Persistenz. Sie können eine oder mehrere Anwendungen mit einer Datenbank über einen langen Zeitraum ausführen, ohne befürchten zu müssen, dass Daten verloren gehen. Aber Spielekunden brauchen das absolut nicht.

Sie möchten also jedes Objekt erhalten, das weniger als 1000 Pixel entfernt ist?
Das wäre:

List<Entity> retVal;
for(entity in entities)
  if(Distance(entity.pos(), to) < 1000)
     retVal.append(entity);
return retVal;

Was würde eine Datenbank Ihrer Meinung nach tun, wenn Sie sie bitten würden, jedes Objekt mit weniger als 1000 Pixel zu entfernen?
Es würde genau das gleiche tun! Nur mit einem Haufen Overhead, der diese extrem einfache Operation ungefähr das 100-fache der Prozessorzeit kosten würde (abhängig davon, wie viele Entitäten Sie haben). Datenbanken sind keine Magie.

Verwenden Sie Datenbanken nur für Serveranwendungen.

API-Beast
quelle
2
SQL Server verfügt über räumliche Indizes. Es wird nicht alle Datensätze durchlaufen, sondern einen Smart-Index-Ansatz verwenden
MichaelD