Wie und wo, lagern Spiele all die Daten ab?

B

BloodSteam

Guest
Hallo,
Ich erstelle gerade ein Spiel in UE4 und hab jetzt ein kleines Problem.

Wie lagern die ganzen Spiele ihre Daten ab? Welcher Spieler welche Items hat, wie viel EXP etc.
Hauptsächlich geht es um die Items.

Soweit benutze Ich PHP 7.1 und eine MySQL Datenbank(MySQLi).
Das ganze Loginsystem hab Ich schon, einloggen etc ist kein Problem.
Ich connecte mein Projekt mit einer Datenbank die auf meinem Webhosting läuft, irgendwie kann Ich es mir nicht vorstellen, dass die Spiele Devs es auch so machen.
Ich nehme mal an, dass die vielleicht eine andere Datenbank nutzen und die auf einem Dedizierten Server laufen lassen wie zb FreeBSD?

Bei einem Spiel muss man dann die Erfahrung(EXP) in einer Datenbank abspeichern nach jedem Mob den man getötet hat. Somit ist es viel arbeit für die Datenbank, nehme Ich mal an.
zb 200 Spieler * 10 mobs = 2000 requests. Dies kann Sich auch schneller stappeln, mit dem Drop, missionen, quests etc.

Wisst Ihr vielleicht welche Datenbank da genutzt wird?
 
Normalerweise verbindet man sich nicht direkt mit der DB, sondern da hängen ein paar Server davor, die die Transaktionen verwalten.
 
Ach du redest nicht von Spielständen, sondern von Live-Gaming?

In diesem Falle macht das HTTP-Protokoll wenig Sinn. Du benötigst da schon ein für Echtzeit-Übertragung optimiertes Protokoll. Temporäre Statis kannst du Serverseitig in einer arbeitsspeichergestützten Datenbank wie MemcacheD oder Redis ( In-Memory-Datenbank – Wikipedia ) verwenden. Primäre Statis schreibst du in Intervallen in eine andere Datenbank.

Aber HTTP zur Kommunikation emfehle ich für solche Echtzeit-Anwendungen garnicht!
 
Die meisten Spiele erstellen ihre Savegames lokal. Über Steam oder ähnliches werden die meist standardisiert verwaltet und dann mit einem Server dort synchronisiert.

Mich interessiert gerade eher, wie man nur mit PHP und einer MySQL-Datenbank ein Spiel programmieren will :wow:

Oder vielleicht habe ich falsch verstanden was du gerade tust?


Edit:
Nach dem ich den Beitrag noch mal gelesen habe: Meintest du ein reines Browserspiel, bei dem (irgendwie) alles serverseitig gespeichert wird?
Dann benötigt jedes Objekt wohl eine Position auf der Map oder ein Inventar in dem es liegt. Dafür brauchst du grundlegend eine passende Datenbank.

Die Frage ist, wie das Projekt skalieren wird. Als kritisch sehe ich hier die Zugriffszeiten auf deine Objektdatenbank an. Bei genug Speicherzugriffen wirst du vermutlich irgendwann auf ein verteiltes System wechseln müssen, wie ein Hadoop-Cluster oder so.

Aber erstmal würde ich empfehlen die Zugriffe so effizient wie möglich zu entwerfen und dich um grundlegende Funktionalität zu kümmern. "premature optimization is the root of all evil", wie Donald Knuth so schön gesagt hat.
 
Zuletzt bearbeitet:
Meinst du Online Gaming? Geht aus deinem ursprünglichen Beitrag nicht hervor.

Bei Online Games kommt es stark auf die Art des Spiels an.
Wenn du wirklich Alles in Echtzeit zum Server und zurück bekommen willst (z.B. Spielerpositionen etc.), brauchst du eher etwas Richtung Websockets, daher (Semi)-Echtzeit Streaming.
Da wirst du aber mit PHP und MySQL nicht weit kommen.

Wenn es dir um Items und Ähnliches geht, kann man eine regelmäßige Synchronisierung zwischen Client und Server machen. Daher alle X Sekunden die Änderungen zum Server schicken (neue Items, weggefallene Items etc.)
Muss wie alles bei Online-Games natürlich gegen Manipulation abgesichert sein.
 
Also damals im Single Play um Trainer zu programmieren, befanden sich die Parameter im RAM. Beim heutigen Online Gaming über Anti Cheating Server wird das dort in Nodes, verketteten Listen gehalten, die Infos. SQL ist Game Programmierern zu Lame. Das machen die Python Anwendergesichter, mehr schlecht als recht. SQL hat zu viel Overhead.

Merke, wer ein Game schreiben kann, kann auch verkettete Listen Low Level verwalten von ihm aus via static struct. So viel wie man braucht, nicht mehr. Die letzte Node hat einen Zeiger auf die erste Node. Fliegt eine Node raus, zeigt der vorherige Node auf die nächst vorhandene Node, vise versa. Das ist rasend schnell. Man nennt sowas auch geilen Richtig schnellen Netcode, daran sind schon viele Simulationen und Games gescheitert. Die Lamer sagen dann, Ping ist schuld. 20msec Ping auweia. Fastpath muss her :-)
 
Zuletzt bearbeitet:
Also Ich mache mein Spiel in Unreal Engine 4 und leider kann mir irgendwie keiner, in en UE4 Foren helfen. Ich hab auch gefragt, ob man Structs oder Tabellen auf dem Server erstellen kann... keine Antwort. Bei einer MySQL / mongoDB etc kann man direkt Sachen ändern.
Ich will es so machen, dass bei jeder Map ein call an das PHP Programm gesendet wird und gefragt wird "Wurden irgendwelche Items aktualisiert?" zb mit einem Timestamp...
wenn ja, die neuen Werte von der Datenbank laden.
Würde alles in Echtzeit passieren ohne den Server neu zu starten.
Ich bin jetzt bei einem anderem Webhosting Anbieter der SSDs verwendet, für FTP und Datenbanken. Muss Ich mal später gucken ob es da ein Unterschied zu OVH gibt (OVH ist mein altes Webhosting).
Bei dem neuem Hosting muss Ich "localhost" als Server für die Datenbanken verwenden, weil es auf der gleichen SSD ist, glaube Ich. Was mich zum nachdenken bringt, sind die Hacker die in die Datenbank mal kurz reinschauen könnten.
Hab auch mal MemCache kurz benutzt aber nicht richtig verstanden.
Die Items etc die man droppt, würde man nur ein call an die Datenbank machen, wenn man es aufhebt und nicht wenn man es sieht.
Die Spieler Position würde man jede 2 Sekunden updated in der Datenbank. Du loggst dich aus, logout screen wird dann ein 2s cooldown haben und in den 2s wo man sich ausloggt wird die Position aktualisiert und an die Datenbank geschickt, dann ist man da wo man war beim einloggen :)
Ingame wird die Position zwischen Server -> Client jeden Frame aktualisiert, aber es wird nur jede 2s in der Datenbank GESPEICHERT.
Game Server wird nur eine Verbindung zu der Datenbank haben.

Hier hab Ich ein kleinen Test gemacht. Die 130ms / 86ms sind vom einloggen und nicht das öffnen.
Beim HDD Webhosting gibt es auch ein GEO Cache, bei dem SSD nicht.

Beim Laden der Domain bzw Index kommt man auf:
SSD: 17ms
HDD: 28ms

Browser: Chromium

Importieren der Datenbank (MySQL) via SQL dauerte (SSD) 0.00005ms (mit paar Test usern drin) beim HDD dauerte es 0.72 - schlag mich tot - ms
 

Anhänge

  • test.png
    test.png
    277,4 KB · Aufrufe: 135
Zuletzt bearbeitet:
Hallo,
Ich erstelle gerade ein Spiel in UE4 und hab jetzt ein kleines Problem.

Wie lagern die ganzen Spiele ihre Daten ab? Welcher Spieler welche Items hat, wie viel EXP etc.
Hauptsächlich geht es um die Items.

Soweit benutze Ich PHP 7.1 und eine MySQL Datenbank(MySQLi).
Das ganze Loginsystem hab Ich schon, einloggen etc ist kein Problem.
Ich connecte mein Projekt mit einer Datenbank die auf meinem Webhosting läuft, irgendwie kann Ich es mir nicht vorstellen, dass die Spiele Devs es auch so machen.
Ich nehme mal an, dass die vielleicht eine andere Datenbank nutzen und die auf einem Dedizierten Server laufen lassen wie zb FreeBSD?

Bei einem Spiel muss man dann die Erfahrung(EXP) in einer Datenbank abspeichern nach jedem Mob den man getötet hat. Somit ist es viel arbeit für die Datenbank, nehme Ich mal an.
zb 200 Spieler * 10 mobs = 2000 requests. Dies kann Sich auch schneller stappeln, mit dem Drop, missionen, quests etc.

Wisst Ihr vielleicht welche Datenbank da genutzt wird?


Also meistens hast du einen dedicated Gameserver, der dies ebenfalls managed. Also stell dir Battlefield vor: Das Spiel wird gehosted auf einem dedicated Gameserver. Dies ist ein Programm, welches alle eingehenden UDP Verbindungen von den Spielern entgegen nimmt und das Spiel leitet, nach den Regeln der Spielmechanik. Stichwort hier ist Konsensus. Alle Spieler senden ihren Zustand (Position, Leben, Munition etc.) an den Gameserver, dieser entscheidet, was der neue Zustand für alle Spieler im nächsten Frame sein wird. Frame hier im Sinne der Gameserver Tickrate, resp. wie oft pro Sekunde ein Konsensus garantiert wird. Nun wird der Gameserver schlussendlich deine Erfahrungspunkte verwalten, weil nur der Gameserver die Korrektheit derer verifizieren kann, durch den eben genannten Konsensus. Der Gameserver redet dafür via einer weiteren Verbindung, nun über TCP mit einem Webservice, im Battlefield Falle an irgendeinen EA/Origin Webserver, der dein Spielerprofil verwaltet. Der Webservice hat eine Datenbank im Hintergrund, der alle Spielerprofile kennt. Wie das skalierbar gemacht wird, ist ein Thema für sich. Wichtigste Erkenntnis hier: Nicht der Spieleclient, also das im Laden zu kaufende und installierbare Spiel updated dein Spielerprofil, sondern der Gameserver (Bei den meisten Multiplayer spielen). Manche weniger kritische Spiele machen das sicher im Client.

So einen Webservice hast du am schnellsten mit Node.js oder Python geschrieben. Datenbanktechnologie ist bei so etwas richtig Wurst. MongoDB, PostgreSQL, MySQL, nimm was du willst.
 
Die hohen Latenzen sind dem HTTP-Protokoll geschuldet. HTTP ist ein Zustandsloses Protokoll. Für jeden Request wird eine neue TCP-Verbindung benötigt und der Webserver führt eine Menge Rechenarbeit durch. Dazu kommt dann auch die Arbeit mit und von PHP, die ebenfalls bei jedem Request anläuft. Wie schon gesagt, eignet sich ein Webserver für Echtzeitaufgaben überhaupt nicht und durch den hohen Rechenaufwand bei den Requests schafft ein Webserver auch nicht viele Clients, die ständig Daten an ihn senden, aus.

Da kommt man meist um ein eigenes spielspezifisches TCP-Protokoll und einer serverseitigen Verarbeitungssystematik nicht herum. So blöd es ist.
 
Also meistens hast du einen dedicated Gameserver, der dies ebenfalls managed. Also stell dir Battlefield vor: Das Spiel wird gehosted auf einem dedicated Gameserver. Dies ist ein Programm, welches alle eingehenden UDP Verbindungen von den Spielern entgegen nimmt und das Spiel leitet, nach den Regeln der Spielmechanik. Stichwort hier ist Konsensus. Alle Spieler senden ihren Zustand (Position, Leben, Munition etc.) an den Gameserver, dieser entscheidet, was der neue Zustand für alle Spieler im nächsten Frame sein wird. Frame hier im Sinne der Gameserver Tickrate, resp. wie oft pro Sekunde ein Konsensus garantiert wird. Nun wird der Gameserver schlussendlich deine Erfahrungspunkte verwalten, weil nur der Gameserver die Korrektheit derer verifizieren kann, durch den eben genannten Konsensus. Der Gameserver redet dafür via einer weiteren Verbindung, nun über TCP mit einem Webservice, im Battlefield Falle an irgendeinen EA/Origin Webserver, der dein Spielerprofil verwaltet. Der Webservice hat eine Datenbank im Hintergrund, der alle Spielerprofile kennt. Wie das skalierbar gemacht wird, ist ein Thema für sich. Wichtigste Erkenntnis hier: Nicht der Spieleclient, also das im Laden zu kaufende und installierbare Spiel updated dein Spielerprofil, sondern der Gameserver (Bei den meisten Multiplayer spielen). Manche weniger kritische Spiele machen das sicher im Client.

So einen Webservice hast du am schnellsten mit Node.js oder Python geschrieben. Datenbanktechnologie ist bei so etwas richtig Wurst. MongoDB, PostgreSQL, MySQL, nimm was du willst.

Würde gerne Node.js benutzen und auch lernen, Problem ist halt Node.js an sich. Man muss es installieren, beim Hosting sowas zu installieren ist nicht möglich. Man braucht dann bestimmt ein root server wo man alles machen kann was man will. Der kostet aber keine 5-10€ Monatlich sondern 20-60€. Die Datenbank soll nur zum abspeichern vom Spielstand dienen. Es muss ja nicht bei jedem Mob kill sofort auf die Datenbank zugegriffen werden.
 
Würde gerne Node.js benutzen und auch lernen, Problem ist halt Node.js an sich. Man muss es installieren, beim Hosting sowas zu installieren ist nicht möglich. Man braucht dann bestimmt ein root server wo man alles machen kann was man will. Der kostet aber keine 5-10€ Monatlich sondern 20-60€. Die Datenbank soll nur zum abspeichern vom Spielstand dienen. Es muss ja nicht bei jedem Mob kill sofort auf die Datenbank zugegriffen werden.

Ich habe bei Host-Europe einen V-Server inkl. der Möglichkeit NodeJS zu installieren für 9,99/Monat.
Starter reicht. Virtual Server – Der ultimative, hoechst zuverlaessige vServer

Wenn du da buchst, gib mal Bescheid, würde dir dann meine Kundennummer als Werber schicken ;p
 
Ich habe bei Host-Europe einen V-Server inkl. der Möglichkeit NodeJS zu installieren für 9,99/Monat

Und wem DAS noch zu viel ist, findet bei anderen Anbietern sogar NOCH günstigere Angebote - nur dann vermutlich ohne Werbe-Bonus von/für ZAM. :rollen:

Bei manchen (seriösen) Anbietern bekommt man sogar virtualisierte Server mit dediziert-zugewiesener Hardware für <= 10€/Monat.
Ich möchte hier jetzt unter Berücksichtigung von §4.4 der Forenregeln keine Namen nennen, aber mit ein bisschen Suchen wird man fündig. ;)
 
Und wem DAS noch zu viel ist, findet bei anderen Anbietern sogar NOCH günstigere Angebote - nur dann vermutlich ohne Werbe-Bonus von/für ZAM. :rollen:

Bei manchen (seriösen) Anbietern bekommt man sogar virtualisierte Server mit dediziert-zugewiesener Hardware für <= 10€/Monat.
Ich möchte hier jetzt unter Berücksichtigung von §4.4 der Forenregeln keine Namen nennen, aber mit ein bisschen Suchen wird man fündig. ;)
Immer diese unterschwelligen Aggressionen aus irgendwelchen unerfindlich bösartigen Motiven heraus. Ich habe nur empfohlen, wo ich selbst bin und nach XX Jahren mit dem Support mal zufrieden. Vor allem bei den einfachen Möglichkeiten zur Kündigung, Up- und Downgrades sowie Verwaltung.
 
Immer diese unterschwelligen Aggressionen aus irgendwelchen unerfindlich bösartigen Motiven heraus. Ich habe nur empfohlen, wo ich selbst bin und nach XX Jahren mit dem Support mal zufrieden. Vor allem bei den einfachen Möglichkeiten zur Kündigung, Up- und Downgrades sowie Verwaltung.

Ach quatsch. War doch gar nicht böse gemeint. ;)
Ich wollte nur aufzeigen, dass es vServer auch noch günstiger geben kann, falls 10€/Monat immer noch zu viel sein sollten.

Die Anspielung auf den Werbe-Bonus war lediglich als Gag gemeint.
Versöhnungsbit gesetzt, alles wieder gut? ;)
 
Und wem DAS noch zu viel ist, findet bei anderen Anbietern sogar NOCH günstigere Angebote - nur dann vermutlich ohne Werbe-Bonus von/für ZAM. :rollen:

Bei manchen (seriösen) Anbietern bekommt man sogar virtualisierte Server mit dediziert-zugewiesener Hardware für <= 10€/Monat.
Ich möchte hier jetzt unter Berücksichtigung von §4.4 der Forenregeln keine Namen nennen, aber mit ein bisschen Suchen wird man fündig. ;)

Was soll Ich mit "dediziert-zugewiesener Hardware" verstehen? Dass mir zb 1 Kern zugewiesen wird?
 
Ich hab mir NodeJS auf einer VM installiert und meine Frage wäre jetzt, kann Ich auf PHP verzichten und es alles in JS machen?
Ja. Aber du musst da etwas umdenken. Denn das ganze arbeitet doch erheblich anders. Während PHP entweder als Modul (meist Socketbasiert), CGI oder FastCGI an einen Webserver angebunden werden, musst du bei Node den Webserver "selbst programmieren". Du kannst zwar einen Webserver davorschalten, um es zum einen leichter mit HTTPS und dem Loadbalancing zu haben. Aber auf Seitens Node.JS brauchst du eben auch einen Webserver. Aber das klingt komplizierter als es ist. Mit Express.JS lässt sich sowas erstaunlich leicht realisieren.

Node läuft im Vergleich zu PHP permanent. Bei PHP wird die Abarbeitung deines Programms durch den Webserver ausgelöst und läuft dann pro Request genau einmal durch. Bei Node Läuft dein Programm dauerhaft. Die Anfragen werden durch Events getriggert und der Request wird dann an Unterprogramme (Funktionen, Methoden etc.) geleitet. Der Rest des Programms, sofern es dafür auch geschrieben ist, läuft durchgehend, wodurch du auch in der Lage bist, einen frei programmierten UDP bzw. TCP Server laufen zu lassen, was bei der Echtzeitkommunikation von erheblichen Vorteil ist.

Es gibt für Node nahezu alles wichtige. Von Template-Engines über Routing-Engines bis hin zu Verschlüssellungsbibliotheken, Datenbanktreiber, String-Bibliotheken (Markdown, BBCode und Co.). Das kann man sich alles über den Node Package Manager zusammensuchen. Ist aber eben auch eine starke Umgewöhnung. Aber wenn man sich dem ganzen hingibt, wird merken, wie mächtig das Teil ist und die Möglichkeiten sind fast grenzenlos.
 
Zurück