MMO Datentransfer



  • Hallo,

    ich habe neulich drüber nachgedacht wie ein MMO (oder ähnliches, hauptsache online mit vielen Spielern) eigentlich technisch realisiert wird.

    Nehmen wir mal ein World of Warcraft als Beispiel: 25 Spieler kloppen auf einen Boss. Aber was genau passiert da genau? Kaum etwas von den vorhandenen Aktionen lässt sich clientseitig verarbeiten, folgedessen stelle ich mir das vor:

    Ein Spieler wirkt irgendeine Fähigkeit. Es wird eine "Nachricht" (Objekt, was auch immer) zum Server gesendet, welche Informationen über Spieler (Position, ...) und gewünschte Aktion erhält. Der Server ermittelt dann:
    - ist die Aktion zulässig? (steht der Spieler in Line of Sight, ist die Fähigkeit bereit, ...)
    - wenn ja: verarbeite die Nachricht weiter -> was passiert mit der Fähigkeit? Trifft sie, verfehlt sie? Wenn sie trifft: wieviel Schaden macht sie (abhängig von den Attributen des Spielers und des Ziels), etc. Das Resultat dieser Verarbeitung wird an den Client zurückgesendet, der dann nur mehr eine Zahl oder einen Text anzeigt.
    - wenn nein: zurück an den Client das die Aktion nicht möglich ist.

    Mehr oder weniger schickt der Client also wirklich nur "was will wer der Spieler tun" zum Server und alles mögliche passiert dann dort und der Server antwortet entsprechend. Dinge wie "aktuelle Attribute" (Buffs, Debuffs, ...) müssten dann serverseitig ermittelt werden, da das clientseitig zu gefährlich wäre.

    Einfach gesagt: der Client repräsentiert grafisch eigentlich nur die Aktionen die am Server statt finden?

    Falls dem so ist: entsteht dadurch nicht eine hohe Last? Schließlich klopfen 25 Spieler (oder mehr bzw. weniger) gleichzeitig auf ein Ziel ein. Kommen die gesamten Aktionen am Server dann in eine Warteschlange (ausgehend z.B. von zwei gleichzeitig gestarteten Aktionen die sich gegenseitig ausschließen würden (z.B. eine Heilung und ein Hit gleichzeitig, wobei der Hit das Objekt töten würde und die Heilung sie aber hochheilen würde))?

    Wenn das alles so abläuft: weiß man wie oft eine Client/Server-Synchronisation statt findet? Das müsste ja mindestens 30 mal und öfter pro Sekunde passieren um "lagfrei" handeln zu können. Ist das nicht enorm für den Server?

    Dazu kommen ja noch so lustige Effekte wie Procs. Die müssten dann ja auch alle am Server ermittelt werden. Pro Spieler.

    Diese Synchronisation stelle ich mir enorm schwierig vor, oder täusche ich mich da?

    Schöne Grüße



  • Wirklich lustig wird es, wenn viele Spieler sich gegenseitig sehen, dann muss der Server nämlich die ganzen Pakete an alle diese Spieler senden. Deswegen ist es auch kein Problem wenn 6000 Spieler gleichmäßig auf der Karte verteilt sind, aber wenn nur 400 davon in Sichtweite stehen, geht der Server ein. 😉 Ansonsten, HP-Berechnungen etc. (eben die gesamte Rollenspiel-Logik) sind ziemlich lächerlich. Interessant wird allerdings collision detection, das ist ziemlich rechenintensiv. Viele Spiele legen das deshalb auf den Clienten, und dadurch werden dann so lustige Hacks mit denen man durch Wände laufen kann möglich.



  • An das habe ich noch gar nicht gedacht. Wie weiß denn der Server dann eigentlich, wann sich 2 Spieler sehen? Der kann doch nicht bei jeder Sendung überprüfen ob sich 2 Spieler sehen, dass wären bei 6000 Spieler ein paar viele Permutationen ^^



  • Ich vermute mal du meinst mit "sehen" irgendwelche Lognachrichten oder so.

    Der Server benutzt wahrsheinlich einen Baum. Dann geht das recht fix solange nicht zu viele Spieler in der direkten Umgebung sind.



  • Heutzutage ist es erstrebenswert, allerlei Berechnungen auf dem Server ausführen und den Clienten lediglich die Darstellung übernehmen zu lassen (wie z.B. bei "League of Legends", welches aber auch immer wieder langsame Server zu beklagen hat).
    Dies verspricht ein Höchstmaß an Sicherheit, z.B. um Hacks zu verhindern, welche lediglich noch zum privaten Modelling verwendet werden könnten (z.B. bei "Monster Hunter Tri" auf der Wii, wo bei manchen Leuten pinke Mini-Monster die Spieler abschlachten).
    Alte Spiele lassen nahezu alles Client-seitig laufen, was es Hack-Entwicklern leicht macht, im Speicher der Anwendung Manipulationen vornehmen zu lassen, welche auch andere Spieler beeinflussen ("Counter-Strike" ist deswegen extrem Cheater-verseucht).
    Das Sicht-Problem hat Guild Wars 2 neulich wieder in fataler Weise erleben müssen, als in einem Event so viele Spieler an einem Fleck waren, dass der Server extrem gelaggt hat, bis sich die Kunde verbreitete, dass alle mal schön gerade in den Himmel blicken und sich an der Minimap orientieren sollen - kurios, aber es hat funktioniert.

    Es muss also eine gesunde Verteilung auf Client und Server erreicht werden, um angenehm spielen zu können. Leiden muss immer jemand: der Nutzer oder Server-Betreiber wegen alter bzw. weniger Hardware.



  • Dass Hacks bei Counter-Strike wesentlich auffälliger sind als bei anderen Spielen hat weniger mit der Architektur zu tun, als einfach mit dem Genre. Da kann man noch so viele Aufgaben dem Server überlassen, einen Aimbot kann man trotzdem immer schreiben.


  • Mod

    cooky451 schrieb:

    Dass Hacks bei Counter-Strike wesentlich auffälliger sind als bei anderen Spielen hat weniger mit der Architektur zu tun, als einfach mit dem Genre. Da kann man noch so viele Aufgaben dem Server überlassen, einen Aimbot kann man trotzdem immer schreiben.

    Aber einen Wallhack, Speedhack, Maphack, usw., nicht so leicht.


  • Mod

    Lokart schrieb:

    Einfach gesagt: der Client repräsentiert grafisch eigentlich nur die Aktionen die am Server statt finden?

    ja, das ist eine typische console. input und output wird auf client seite gemacht (deswegen gab es fuer ultima z.b. verschiedene clients), der server bekommt nur die paar bytes vom user input und schickt den clients was sie anzeigen sollen.

    Falls dem so ist: entsteht dadurch nicht eine hohe Last? Schließlich klopfen 25 Spieler (oder mehr bzw. weniger) gleichzeitig auf ein Ziel ein. Kommen die gesamten Aktionen am Server dann in eine Warteschlange (ausgehend z.B. von zwei gleichzeitig gestarteten Aktionen die sich gegenseitig ausschließen würden (z.B. eine Heilung und ein Hit gleichzeitig, wobei der Hit das Objekt töten würde und die Heilung sie aber hochheilen würde))?

    der server verarbeitet die informationen einfach so wie sie kommen, sagen wir mal du hast 100leute, jeder schafft es 10 klicks pro sekunde zu machen, dann verarbeitet der server 1000klicks (bei x:2byte y:2byte also <4kb/s). aus diesem grund koennen MMOs wie Eve tausende spieler auf einem server verarbeiten.

    Wenn das alles so abläuft: weiß man wie oft eine Client/Server-Synchronisation statt findet? Das müsste ja mindestens 30 mal und öfter pro Sekunde passieren um "lagfrei" handeln zu können. Ist das nicht enorm für den Server?

    du siehst auf dem client nicht welchen lag ein server hat, zumeist zeigen clients schon irgendwelche animationen und partikel, oder spielen sounds bevor der server die daten ueberhaupt hat und dann 200ms-500ms spaeter sieht der client was los ist. mmo server muessen nicht mit 30Hz laufen.

    Dazu kommen ja noch so lustige Effekte wie Procs. Die müssten dann ja auch alle am Server ermittelt werden. Pro Spieler.
    Diese Synchronisation stelle ich mir enorm schwierig vor, oder täusche ich mich da?

    ja, du taeuscht dich, vor 20jahren haben heimcomputer schon soviele einheiten in RTS spielen verarbeitet und da wurde alles in software gezeichnet und so 95-99% der rechenzeit ging auch dafuer drauf. 100 oder 100einheiten zu verarbeiten ist echt simpel, zumal das aufwendigste pro einheit meistens die AI ist (z.b. visibility raycasts die von der physic verarbeitet werden).


  • Mod

    Lokart schrieb:

    An das habe ich noch gar nicht gedacht. Wie weiß denn der Server dann eigentlich, wann sich 2 Spieler sehen? Der kann doch nicht bei jeder Sendung überprüfen ob sich 2 Spieler sehen, dass wären bei 6000 Spieler ein paar viele Permutationen ^^

    was glaubst du ist schlauer, 6000spielern ein event zu schicken, oder bei 6000 spielern den radius zum event zu berechnen und nur 10von ihnen das jeweilige event zu schicken? 😉
    ja, pfandfrage.



  • SeppJ schrieb:

    Aber einen Wallhack, Speedhack, Maphack, usw., nicht so leicht.

    Was ist ein Maphack? Speedhacks kann man vielleicht noch verhindern, ist aber auch so ziemlich das einzige. Wenn man Spielerpositionen nur schickt wenn sie sichtbar sind, erzeugt das zu viel Latenz. Und wie Wände gezeichnet werden, darauf hat der Server nun offensichtlich keinen Einfluss.



  • Maphack ist, das alle Spieler direkt auf der Minimap angezeigt werden.



  • cooky451 schrieb:

    Und wie Wände gezeichnet werden, darauf hat der Server nun offensichtlich keinen Einfluss.

    Er kann aber wissen, wo sie sich befinden.


Anmelden zum Antworten