Netzwerkkommunikation/Multiplayer, Ideen für Umsetzung

    • GM 8

      Netzwerkkommunikation/Multiplayer, Ideen für Umsetzung

      Guten Tag.

      Ich weiß nicht, ob dieses Thema in die Expertenrunde reinpasst, aber eine technische Frage ist dies auch nicht wirklich.

      Also, ich arbeite zurzeit an einem kleinen Multiplayergame.
      In einem Raum befinden sich bis zu 10 Clients, also 10 Instanzen, die fast durchgehend Ihre Position verändern und Aktionen ausführen.
      Diese 10 Clients müssen natürlich immer wieder Ihre Bewegungsinformationen an den Server senden.

      Ich habe bereits mehrmals versucht, das mit 39dll umzusetzen, aber da gab es bereits bei 3 Spielern bereits eine Verzögerung.
      Man kann das eigentlich nicht mal als "Lag" bezeichnen, da sich die Spieler tatsächlich einfach um ein paar Sekunden(!) verzögert bewegen.
      Also wenn z.B. ein Spieler sich von A nach B bewegt, sieht der andere Spieler das Ganze flüssig, aber eben viel später, als es tatsächlich passieren sollte.
      Das liegt natürlich daran, dass der Server sehr viele Informationen geschickt bekommt, und die alle nach der Reihe verarbeiten muss.

      Aber bei vielen anderen Onlinegames bewegen sich ja hunderte Spieler gleichzeitig, und da gibt es so gut wie keine Verzögerung.

      Da wollte ich nun fragen, ob das Problem bei Game Maker, an 39dll oder an meiner Umsetzung liegt.
      Hattet Ihr dieses Problem schon einmal, bzw. wie würdet Ihr die Ganze Sache angehen?

      Im Notfall werde ich das Ganze in C# schreiben, aber da ich mit meinem lieben Game Maker einfach am besten umgehen kann, würde ich mich über eine gute Lösungsansatz freuen!
      Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
      Öhm wieso benutzt du noch die 39.dll wenn doch gamemaker mittlerweile die Netzwerkfunktionen direkt integriert hat.

      Also ich kann dutzende von Clienten zum Server verbinden ohne das es Probleme gibt und das bei einer Verzögerung von 1 Step.

      EDIT: Hab nicht gesehen das du kein Studio hast :) sry.
      Ich hoffe, dass ich mich an mein PayPal Passwort erinnern kann.

      Edit: Es scheint, als ob die Netzwerkfunktion von GM:S doch nicht so leistungsstark ist.
      Ich denke, dass Du das einfach nur lokal auf einem PC getestet hast, da geht das logischerweiße schneller.
      Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „levarris07“ ()

      Das kommt immer drauf an, wie viele Daten du überträgst. MAch dir mal Gedanken drüber, was du wirklich senden willst (Bei einem Room Speed von 60 in jedem Step x und y zu übertragen ist zum Beispiel genau das, was solche starken Verzögerungen bewirkt). Wie schon erwähnt, muss der Server ja alle Clients verwalten, drum sollte der auch auf maximalem Room Speed laufen. Genauere Hilfe kann ich dir aber auch nur geben, wenn du mehr über deine Übertragung bekannt gibst.

      © 2008 by Teamgrill Productions
      Danke für den Tipp, werde das sofort ausprobieren.
      Dachte nicht, dass das auf diese Art schneller gehen könnte.

      Das kommt immer drauf an, wie viele Daten du überträgst. MAch dir mal Gedanken drüber, was du wirklich senden willst


      Das ist mir natürlich klar, aber eben da liegt das Problem. Wenn sich diese 10 Clients durchgehend bewegen, müssen sie viele Daten senden.
      Habe bereits versucht, in größeren Abständen zu senden, oder einfach nur Tastendrücke zu übermitteln, was aber entweder zu Ungenauigkeiten oder Ruckeln führte.
      Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
      Die Kombination aus Tastendrucken und Positionskorrigieren funktioniert eigentlich ziemlich problemlos bei mir. Kommt auf die Bewegungsart des Spielers an, aber grundsätzlich ist die Idee, jedes Mal, wenn ein Spieler seine Richtung oder Geschwindigkeit ändert, die neuen Werte, mitsamt seinen aktuellen Koordinaten an den Server zu senden. Der Server setzt den Spieler dann an die gegebenen Koordinaten (Positionskorrektur) und wendet dann die neue Geschwindigkeit/Richtung an. Das sorgt einerseits für eine flüssige Bewegung und korrigiert auch die Positionen, sollte die Übertragung einmal nicht allzu schnell sein. Am besten ist es, dem Server so viel Arbeit wie möglich abzunehmen.

      © 2008 by Teamgrill Productions
      Dadurch würde aber bei z.B. einem Ping von 50ms (Durchschnitt) ein Delay von 100ms enstehen.
      Wenn der Spieler seine Position erreicht, werden vom Server seine Koordinaten gesendet (Da bei diesem Spiel die exakte Position wichtig ist.)

      Ich habe das Ganze mal getestet: Client A bewegt sich nach rechts, bleibt stehen. Eine paar millisekunden später ruckelt er aber (Bei Client B) kurz auf die Position zurück, die der Server ursprünglich vom Client erhielt.
      (Aber nur, falls der Spieler sich nach dem Stoppen direkt wieder bewegt.)
      Problem 2: Diese Methode (Tastendrücke + Koordinaten) ist einfach zu hacken, oder?
      Ich möchte das Spiel möglichst sicher machen, sodass der Client nichts Anderes als eine Steuereinheit ist.
      Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
      Da es doch vielleicht auch für andere interessant ist, hier nochmal ein paar Überlegungen: Wenn es wirklich so genau sein soll, kannst du:
      • Zusätzlich regelmäßig x und y Position versenden, zb im Sekundentakt (und zusätzlich optimal per UDP)
      • Den Ping miteinberechnen. Das ist schon ein größeres Vorhaben. Der Server sagt quasi den anderen Clients vorraus, wie weit sich der Spieler schon bewegt hat, bis die Datenpakete bei den Clients eingetroffen sind. Praktischwerweise, kann der Client bei Bewegung einen Zeitstempel mitsenden, den der Server dann mitsamt den Daten an die anderen Clients schickt. Anhand der vergangenen Zeit können diese sich dann den bereits in dieser Zeit zurückgelegten Weg des Spielers berechnen.

      Grundsätzlich wirst du nicht um ein Ruckeln hinwegkommen, da du ja immer eine kleine Verzögerung hast (Je schneller der Server und dessen Leitung, desto niedriger), man kann hier den Schaden nur minimieren, also die Positionen korrigieren. Also nocheinmal zusammengefasst:
      1. Der Client drückt eine Taste um sich in eine bestimmte Richtung mit einer bestimmten Geschwindigkeit zu bewegen.
      2. Er sendet eine Nachricht mit:
        • Einem Zeitstempel
        • X und Y Koordinaten
        • Neuer Geschwindigkeit und Richtung

      3. Der Server erhält die Nachricht und setzt den Spieler an die empfangenen X und Y Koordinaten. Zusätzlich berechnet er sich mithilfe des Zeitstempels relative X und Y Koordinaten des bereits zurückgelegten Weges und addiert diese zu den Koordinaten des Clients.
      4. Der Server aktualisiert den Zeitstempel und die Koordinaten und schickt die Nachricht an die anderen Clients weiter.
      5. Diese können nun gleich wie der Server den Spieler an die empfangene Position setzen und per Zeitstempel diese ausgleichen.
      6. Der Client lässt die Taste los, Geschwindigkeit und Richtung ändern sich, das ganze wiederholt sich.
      7. Optional per UDP (Da schneller und in dem Fall nicht 100% Verlässlichkeit benötigt) regelmäßig kleine Koordinaten-Nachrichten schicken, zum zusätzlichen Positionsabgleich.

      © 2008 by Teamgrill Productions

      MasterXY schrieb:

      Der Client drückt eine Taste um sich in eine bestimmte Richtung mit einer bestimmten Geschwindigkeit zu bewegen.

      Er sendet eine Nachricht mit:

      Einem Zeitstempel

      X und Y Koordinaten

      Neuer Geschwindigkeit und Richtung

      Ich versende in so einem fall nur das Keyevent direkt.
      Der Spieler drückt eine Preiltaste, dies wird als Keyevent gesendet. Der Spieler lässt die Taste los, dies wir als Keyevent gesendet.
      Der Server kontrolliert die Objekte im sichtbereich des Clienten und sendet bei einer Positionsveränderund diese mit der Geschwindigkeit an den Clienten.
      Der Client führt die Positionsveränderung aus.

      Nicht manipulierbar und weniger Daten.

      Balls of Steel schrieb:

      Ich versende in so einem fall nur das Keyevent direkt.
      Der Spieler drückt eine Preiltaste, dies wird als Keyevent gesendet. Der Spieler lässt die Taste los, dies wir als Keyevent gesendet.
      Der Server kontrolliert die Objekte im sichtbereich des Clienten und sendet bei einer Positionsveränderund diese mit der Geschwindigkeit an den Clienten.
      Der Client führt die Positionsveränderung aus.


      Siehe weiter oben. Das war levarris07 zu ungenau und dabei können bei Verbindungsproblemen ohne weitere Korrekturen ziemliche Probleme auftreten. Was ich geschrieben habe, ist eine Erweiterung dieses Systems.

      © 2008 by Teamgrill Productions