Haftungsausschluss: Meine Erfahrung in der Spielprogrammierung basiert auf clientseitigen Einzelspieler-Spielen, aber ich habe einen Hintergrund in Webanwendungen (speziell auf dem Microsoft-Stack). Daher denke ich, dass ich mit dieser Antwort von dort komme bewerben, aber ohne einen echten Spieleserver tatsächlich zu testen, ist es schwierig zu sagen, wie er angewendet wird, aber hier geht es weiter. Wissen Sie das: Ich habe keinen Spieleserver bereitgestellt, nur Webanwendungen.
Ich würde einen zweistufigen (Server-) Ansatz vorschlagen. Eine Datenbankebene und eine "Anwendungs" -Ebene; Die dritte (Präsentations-) Stufe ist Ihr Spielclient.
Relationale Datenbanken eignen sich hervorragend zum Abfragen von Daten und zum Schreiben von Daten. Der Schlüssel besteht darin, Ihre Datenbankschreibvorgänge in Blöcke mit überschaubarer Größe zu serialisieren, die Ihr Cluster verarbeiten kann. Die erweiterten Editionen (Rechenzentrum / Unternehmen) von SQL Server unterstützen Clustering und Replikation. Ich würde damit beginnen, einen kleinen Cluster zu erstellen und einige Abfragen dagegen auszuführen, um zu sehen, wie es funktioniert.
Wenn Sie in der Anwendungsebene "Zoning" oder ähnliches durchführen, können Sie wahrscheinlich davonkommen, ohne Cluster einzurichten, und einfach einen Server pro Zone einrichten. Wenn Ihre Zonen zu groß werden, können Sie für jede Zone einen Cluster einrichten.
Sie möchten einen Serialisierungsprozess zum Senden von Daten von der Anwendungsebene -> Datenbankebene erstellen. Der Schlüssel besteht darin, mehrere Serialisierungsebenen durchzuführen. So etwas wie das:
- Stufe 1: Alle X Sekunden in der Datenbank speichern, enthält wichtige Daten:
- Spielergesundheit
- Spielergegenstände / Pickups
- Stufe 2: Alle 2X Sekunden in der Datenbank speichern, einschließlich mittlerer Daten:
- Spielerstandorte
- NPC-Standorte
- Level 3: Alles andere, so selten wie möglich
Auf diese Weise bleiben Ihre Schreibvorgänge konsistent und vorhersehbar. Abhängig von der Art Ihres Spiels kann es zu seltenen Datenbankschreibvorgängen kommen. Der Schlüssel ist zu erkennen, dass Sie bei einem Absturz Ihres Anwendungsservers aus dem Status in Ihrer Datenbank wieder online gehen müssen, sodass die Serialisierung des Spielerinventars alle 90 Minuten die Spieler verärgern kann.
Zum Lesen von Daten möchten Sie so viel wie möglich in den Speicher der Anwendungsebene laden und dann sicherstellen, dass Ihr gesamter Code diesen Speicherpool verwendet. Im Hintergrund können Sie den Speicherpool mit der Datenbank synchronisieren. Wie Joe betont, wird es Zeiten geben, in denen Sie "Echtzeit" -Transaktionen benötigen. Wenn Sie die meisten Ihrer Schreibvorgänge serialisieren, sollten Sie immer noch über genügend E / A in Ihrer Datenbank verfügen, um bei Bedarf Echtzeittransaktionen ausführen zu können, vorausgesetzt, die Hardware auf dem Datenbankserver / -cluster ist ausreichend.