Open World (Multiplayer - Mega Server) + Persistent (Speichern/Streaming usw.)

  • Hallo zusammen!

    Ich möchte eine Open World mit einem Mega Server in mein Spiel integrieren da alle anderen Dinge nun soweit erledigt sind (es gibt ja immer etwas zutun).

    Kennt da wer sehr gute Tutorials wie man das alles machen kann?
    Vor allem auch die Persistenz von Gegenständen, Gebäuden usw in der Welt.
    Wie speichert man das alles ab und wie streamt man das rein und raus usw.?

  • Nichts für ungut, aber du hast doch garantiert dein vorheriges Problem noch nicht im Griff und nun träumst du von einem Megaserver?

    Ich habe das vorherige Thema beendet, weil man mir nicht zuhören will.
    Ich brauche diese Variablen weil es ohne nicht geht und muss dann lesen das ich das nicht brauche, obwohl ich es brauche. Da dreht sich die Diskussion im Kreis. Noch dazu ist das ganze von meinem Hauptproblem (Editor Performance) zu weit abgedriftet. Ich habe keine Performance Probleme im Spiel, sondern mit dem Editor. Das sind zwei unterschiedliche Dinge.


    Daher macht es keinen Sinn in diese Richtung weiter zu diskutieren.
    Ich will voran kommen und nicht stehen bleiben und endlos im Kreis drehen.

    • Offizieller Beitrag

    Wenn du eine Frage stellst, macht sich sich natürlich jeder Gedanken wie er dir helfen kann und wie er selbst das Problem lösen würde.

    Dabei kömmt man oft in diese Situation wo man denkt, wenn das und jenes mein Case ist, dann würde es so und so machen und wenn der Case anderst wäre dann würde das Problem eben anderst lösen.


    Wenn du natürlich einfach nur einfach und staighte ne Antwort haben willst, dann fühlt sich dass vielleicht manchmal so an als würde man das Pferd von hinten aufsatteln.


    Daher ist eigentlich immer nur von Vorteil für alle, wenn du sagst was du genau vor hast und warum du es so vorhast.


    Es es gibt hier im Forum niemanden der nicht zuhören will. Warum sollte jemand nicht zuhören wollen ?

    Wenn dann liegt es daran dass diese Leute dein Problem nicht verstehen oder du nicht verstehst warum der Vorschlag die bessere Lösung ist.

    Das ist dann eher ein Kommunikationsproblem.

  • Das weiss ich.


    Bitte beim Thema bleiben. Hier geht es um Open World und was dazu gehört. Das andere Thema ist bereits beendet.

  • Ich habe das vorherige Thema beendet, weil man mir nicht zuhören will.

    Nun, du hast ja auch recht wenig an Infos gegeben. Du hast nur gesagt, dass du über 100 Variablen brauchst, aber nicht wieso. Ich habe dir beschrieben, wie du sie nicht brauchst. Auch habe ich dir klar dargelegt, dass selbst große Softwareschmieden solch einen Wahnsinn niemals tun würden, nicht nur aus Performancegründen, sondern auch aus Debugginggründen.

    Somit bist DU derjenige der nicht zuhört.

    Und was erwartest du jetzt für Antworten, wenn die Frage lautet "Wie machen Megaserver, jetzt"?

  • Ich würde auch vorschlagen erstmal so einen kleinen Testserver aufzulegen, vielleicht mit ein paar Kumpels das Spiel dann ausprobieren, schauen, was funktioniert und was nicht. Wenn es im Kleinen funktioniert, wird es auch auf einem sehr leistungsfähigen Rechner funktionieren. Höchstens kann es dann ja noch Problem mit der Anzahl der Spieler geben, falls die zu hoch ist für die Leistung des Rechners oder der Internetanbindung. Zudem, wenn es sich wirklich um riesige Massen an Spielern handelt, dann werden sich wohl eher mehrere Server die Arbeit und Internetanfragen aufteilen müssen, also ein Multiserversystem. Das wird aber wohl am Anfang noch nicht der Fall sein.

  • Ja, das ist leider ein allgemeines Problem bei der Hobby Games Entwicklung, man findet zwar sehr sehr viele Tutorials mittlerweile zu allen Themen, die meisten sind aber eben nur für die simpelste Auslegung des ganzen. So richtig in die Tiefe geht das fast nie und wenn dann mal, dann nur sehr speziell.


    Ich denke leider auch wenn du bereits danach gesucht hast, das dir kaum wer was besseres finden wird. :(

  • An der Stelle, da schließe ich mich IRO an, ist dann die Suche nach Tutorials eben halt doch beschränkt, auch wenn man angeblich alles im Internet findet.

    Ich weiß aber aus meiner Erfahrung durch Ultima Online, dass das Ganze durch Multiserver gelöst wird. Denn, egal wie schnell ein Rechner ist, egal wie schnell auch die Internetanbindung ist, irgendwann sind die Kapazitäten erschöpft, weswegen man die Welt dann in mehrere Server aufteilt, die dann untereinander wieder die entsprechenden Daten austauschen, bzw. auch Teile einer Welt auf unterschiedlichen Servern laufen.

    Vielleicht findest du ja unter dem Stichwort "Multiserver" eher etwas in den Tutorials, im Zweifelsfall gibt, oder zumindest gab es mal eine Bücherreihe, wo Profis dann ihre Programmiertricks verraten haben. Ich weiß nur leider nicht mehr, wie die hieß. Das Problem dabei ist nur, diese Buchreihe bezieht sich nicht explizit auf die Unreal Engine, ist auch schon was älter, jedes Buch war echt teuer und bezieht sich natürlich nur auf C++.

    Ich weiß gar nicht, ob ich irgendwo in meinen Umzugskartons noch das eine oder andere Buch aus der Reihe habe, vielleicht gibt es ja auch neuere Auflagen davon. Ich befürchte allerdings, selbst wenn dem so ist, dass der Preis und die anderen Einschränkungen bleiben würden.

  • Das mit der Servertechnik werde ich nicht schaffen, dass würde ich machen wenn ich entsprechend Spendengelder gesammelt habe um dann einen Experten einzustellen welcher davon viel mehr Ahnung hat.

    Deshalb würde ich erstmal das mit dem Server abhaken, trotzdem war mir die Erwähnung dafür wichtig, weil die Gegenstände in der Welt ja trotzdem abgespeichert werden müssen.


    Vom Serverprinzip würde ich es ähnlich machen wie bei einem anderen Spiel:

    1. Login-Server (überprüft ob Spieler zugriff hat)
    2. World-Server (Mehrere Welten um die ganze Spielerlaste zu verteilen, man kann frei zwischen den World-Servern reisen)

    3. Shard-Server (Welcher eine bestimmte Großregion im Spiel verwaltet)

    4. Region-Server (Welcher eine einzelne Region verwaltet)


    Shard und Region Server verwalten die Großregionen und Kleinregionen, und teilen so die Kommunikation ein. Spieler in Region A brauchen keine Information von Spieler in Region B, so als Beispiel.



    Hat dann wer ein gutes Multiplayer Tutorial zum abspeichern von Gegenstände, damit diese nach einem Serverneustart z.B. wieder an Ort und Stelle sind usw.?

  • Ich weiß gar nicht, ob es das noch gibt, aber schau doch mal, ob du noch den Sourcecode von RunUO herunterladen kannst. RunUO ist quasi eine Fanversion des Ultima Online Servers und ist, glaube ich, in C# geschrieben. Der Code ist also, mal abgesehen von seinem Umfang, relativ leicht zu lesen.

    Zwar ist das ein sehr altes Spiel, entsprechend auch alte Servertechnik, aber ich denke, dass du aus dem Code trotzdem einiges über Login, Regionsverwaltung usw. lernen kannst, zumindest was das Konzept eines solchen Servers angeht. Einen Versuch ist es auf jeden Fall wert.

  • Huhu,

    Exaran

    Ich habe mir deine Beitrag zu deinem Editor Performance Problem durchgelesen und diesen neuen Post auch. Da du in deinem anderen Beitrag geschrieben hast, dein Item/Datenmanagement baut derzeit auf großen Arrays auf, wirst du wenn du dein Spiel als multiplayerfähiges Spiel im großen Stil anbieten willst, nicht um Datenbanken herum kommen. Auch das Durchsuchen der SQL Datenbanken über PrimaryKeys (einzigartige) ist wie beschrieben der Suche nach Stings vorzuziehen. Schon alleine aufgrund des Fehlerteufels der sich viel zu leicht einschleicht ;).


    Als Beispiel:

    Du hast eine Datenbanktabelle in der du deine Spieler/Benutzerdaten verwaltest. Ein Benutzer hat z.B. in dieser Tabelle den einzigartigen PrimaryKey "23452", nun werden deine erstellten Helden über diesen Key "23452" in einer eigenen "Helden"Tabelle mit dem Benutzerkonto verbunden. Die Helden haben eigene einzigartige PrimaryKeys, über welche du jetzt in einer weiteren "Inventar"Tabelle das Inventar des Helden verbindest. In dieser speicherst du aber auch keine Itemdaten, bzw wieder nur Keys, die auf eine weitere Tabelle zeigen und dort dann endlich die Itemdaten drin stehen.


    Ist einfacher umzusetzen, als es sich hier ließt, wenn man es ein bisschen verstanden hat. Auch ist es ordentlich und recht leicht anpassbar.

    Ich arbeite mit großen Datenbanken, leider (noch) nicht mit der UE. Denke aber, es wird sich nicht sehr groß unterscheiden. Daher kann ich dir leider jetzt auf zackzack aber keine Blueprintbeispiele posten. Muss ich mich erst selbst mit befassen wie es bei UE geht und was geht.


    tl:dr

    Daher empfehle ich dir, dich mit der Mechanik Datenbanken zu beschäftigen. Das wird dein Spiel für multiplayerfähigkeit ganz sicher brauchen. Möglicherweise, soll ja oft vorkommen, eröffnen sich dir ganz neue Wege ans Ziel zu kommen, an die du jetzt noch gar nicht gedacht hast, weil nicht bekannt.

  • Barni
    Danke dir für die Infos.
    Ich werde nicht darum herumkommen jemanden einzustellen welcher das ganze besser kann als ich. Daher muss ich zusehen das ich erstmal das alles zum laufen bekomme um das Projekt in die Finanzierung zu bekommen.
    Es muss nicht von Anfang an ein MMORPG sein, sondern kann im Laufe der Zeit dorthin wachsen (das habe ich für mich nun beschlossen). Weil ich ständig in das Problem hineinlaufe das ich in eine unendliche-Problem-Situation gelange.


    Daher um das ganze ein wenig abzukürzen.
    Mir stellt sich noch eine Frage bezüglich dem Inventar und dem speichern von Informationen.
    Jeder Gegenstand im Spiel muss einzigartig sein und sich von anderen Gegenstände unterscheiden.

    Beispiel:
    Langschwert A hat 100 Schaden (default)
    Langschwert B hat 120 Schaden
    Langschwert C hat 30 Feuerschaden
    Langschwert D hat 10 Schaden auf alle Schadensarten

    usw.

    Daher müssen alle Informationen eines Gegenstandes für sich selber gespeichert werden. Damit jeder Gegenstand auch einzigartig ist, darauf baut das ganze Spielprinzip auf. Ich möchte nicht das die Gegenstände gleich sind.


    Bisher verwende ich als Inventar-System nur das "ItemDataBaseXYZ" Structure.
    Darin enthalten, ItemName, Mass usw.

    Im Actor selber sind aber noch zusätzliche Structures z.B.
    Damage (mit vielen weiteren Variablen darin).

    Darauf habe ich z.B. über das bisherige ItemDataBaseXYZ Structure kein Zugriff, weshalb ich das leider abändern muss. Damit ich zugriff auf die anderen Variablen habe und diese speichern kann, sonst wird nur der default wert genommen.


    Die Frage ist, bleibt dann nur noch der "ActorReference" als Inventar-System übrig?
    Weil ClassReference funktioniert nicht, ich kann damit nur die DefaultClass abrufen, was ja keine Informationen speichern kann.

    SoftReference scheint mir auch nicht hilfreich zu sein.


    Kann ich mit ActorReference alle Informationen hin und her speichern, vor allem wenn ich SpawnActorFromClass mache um dann vom Inventar alle Informationen in den gespawnten Actor zu übertragen?
    Spricht, das mein Langschwert B auch Schaden 120 hat und nicht wieder Langschwert A mit 100 Schaden ist, weil das nicht gespeichert werden kann?

    Es geht hier nur um das übertragen von Informationen. Das ganze muss dann sowieso später aus dem Spiel in eine externe Datenbank übertragen werden, um von da wieder zurück in das Spiel wenn die Abfrage dafür nötig ist.



    Habe mir sehr viele Tutorials dazu angeguckt und fast alle verwenden das System was ich bisher verwende, aber hier stößt man schnell auf Probleme mit den "Unknown Structure" wenn man etwas ändern möchte, weshalb ich davon weggehen möchte. Desweiteren läuft man da in performance Probleme hinein, wodurch das Thema begonnen hat.

    Wenn man ein kleines Spiel macht mag das noch funktionieren aber wenn es größer wird geht es nicht... also schon aber das wäre eine Tortur ständig alles auszubessern.

  • Gehen wir das mal umgekehrt an. Wie viele Spieler sollen auf einem Server spielen?

    Gut, bei einem Indispiel würde ich spontan mal mit bis zu 100 Spielern rechnen, dann ist deine Vorgehensweise vielleicht egal.

    Nu, du überträgst doch auch mit jedem Wert, den du übermittelst Daten und das von jedem Spieler an jeden Spieler. Das heiß, der Upload beim Internet von privat ist ja immer die große Schwäche.

    Wenn du jetzt die Gegenstände eines Spielers an einen Server übermittelst, dann macht es schon einen Unterschied, ob du pro Gegenstand 10 Kilobyte übermittelst oder 20 Kilobyte.

    Klingt erstmal nicht viel, aber nehmen wir mal an, der Spieler hat 100 Gegenstände bei sich, dann ist das ein Unterschied von 1000 Kilobyte.

    Noch schlimmer wird es dann, was du, wohl bemerkt ständig, vom Server an die Clients schicken musst. Nehmen wir auch da mal 100 Spieler. Dann empfängt der Server halt diese 1000 Kilobyte, die vielleicht gar nicht nötig wären und versendet mal eben an alle anderen wieder das 100-fache, also 100.000 Kilobyte. Das sind mal eben 10 Megabyte, mit denen der Server mal eben so beschäftigt ist, diese an alle Spieler zu senden. Und da ist noch nicht berücksichtigt, dass sich die Spielsituation ja auch in Echtzeit ständig ändert.

    Da sind Lags und Asynchronitäten, letztendlich dann auch die Möglichkeiten, das zum Cheaten auszunutzen, im Spiel quasi vorprogrammiert. Und die Berechnungen beruhen nur auf die zusätzlichen und überflüssigen Daten, die dann entstehen, wenn du das nicht besser optimierst.

  • Technisch gibt es einen Mega Server wo die ganze Welt darauf spielen soll.

    Das dies natürlich nicht sinnvoll ist, wären die Sub-Mega Server kontinental.
    Europa, Asien, Afrika usw.


    Darunter sind die World Server und die wiederum aufgeteilt in Shard Server.

    Der World Server ist diese eine Welt und diese Welt ist unterteilt in die Shard Server, damit die Informationen nur dann geteilt werden wenn diese nötig sind und nicht allgemein.


    Es werden ja nur die Daten übertragen die auch nötig sind.

    Sehe ich einen anderen Spieler, interessiert mich der Inhalt des Rucksacks nicht, es sei denn ich sehe darin hinein.

    Ebenfalls interessiert mich kein Spieler der z.B. eine Insel weiter herumläuft. Das sollen dann die Server unter sich ausmachen. Um den Datenverbrauch zu reduzieren.


    Soweit bin ich noch nicht, es geht mir darum wie ich nun weiter mit dem Grundgerüst der Inventarverwaltung weiter verfahren kann.

    Das ganze möchte ich dann stück für stück weiter in Richtung MMORPG ausbauen.

    Es ist mir derzeit egal wie viele Daten übertragen werden, weil das später optimiert wird. Aber soweit bin ich ja noch nicht.


    Daher ist meine Frage:
    Mit welchem "...Reference" kann ich die ganzen individuellen Daten eines Actors (Gegenstand) abspeichern, um diese von der Welt in das Inventar und wieder zurück zu packen, so das die individuellen Daten auch übertragen werden. Weil genau da liegt das Problem.

    Wichtige Info:
    Jeder Gegenstand muss im Spiel komplett frei veränderbar sein! Und diese Informationen müssen entsprechend in dem Gegenstand abgespeichert werden/sein. Deswegen brauche ich auch keine IDs oder irgendwas womit ich etwas aus einer Default-Datenbank abrufen kann (höchstens einmal zum allgemeinen erstellen des Gegenstandes).

  • Daher ist meine Frage:
    Mit welchem "...Reference" kann ich die ganzen individuellen Daten eines Actors (Gegenstand) abspeichern, um diese von der Welt in das Inventar und wieder zurück zu packen, so das die individuellen Daten auch übertragen werden. Weil genau da liegt das Problem.

    Nun ja, in einem normalen Fall würde man das über die UID in der Datenbank machen. Eben halt, wenn man mehrere Gegenstände gleichen Namens, gleicher Kategorie hat, aber halt unterschiedlichen Abnutzungsgrad usw., dann wird halt die einzigartige ID in der Datenbank zu den individuellen Werten führen. Das hatte ich allerdings schon geschrieben.

    Du hast halt eine Datenbank, die ist ellenlang, da steht alles drin, was jemals in dem Spiel hergestellt wurde und auch noch vorhanden ist, also nicht kaputt oder, oder in der Mülltonne gelandet oder so, und aus dieser Datenbank zieht der Gegenstand dann halt über die UID seine Informationen.

    Nehmen wir an, im Inventar hast du ein Gegenstand mit der UID 18278, in der Datenbank steht dann unter 18278, Langschwert, Beidhänder, Schaden min. 30, Schaden max. 50, Attackspeed 3, Feuerschaden +8 usw.

    Du musst halt nur darauf achten, dass deine Waffen dann auch alle möglichst den gleichen Tabellenaufbau haben. Da sind Datenbanken ab und zu ein wenig empfindlich und führen auch gerne mal zu Fehlern.