Multiplayer Performance Tipps

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Multiplayer Performance Tipps

      Autor: Eric Burgess
      Übersetzt von: Sven Lohmann
      Mit freundlicher Genehmigung von: Eric Burgess

      Level: Fortgeschritten

      Ein Multiplayer Spiel zu schreiben ist eine Herausforderung. Dem Spiel eine gute Performance zu geben eine noch größere. Dies ist eine Liste mit Empfehlungen, um die beste Performance aus deinem Spiel herauszuholen.

      Pausiere niemals das gesamte Spiel
      Dein Spiel muss immer nach ankommenden Paketen suchen, und diese verarbeiten. Vergewissere dich, dass die Option „freeze the game when the form loses focus“ nicht aktiviert ist. Immer wenn du das Spiel stoppst, achte auf ankommende Pakete, diese häufen sich und behindern den Kanal. Das verursacht eine Verzögerung.

      Verschicke so wenig Pakete wie möglich
      Ein Paket zu verschicken dauert lange. Verknüpfe so viele Daten wie möglich zu einem Paket zusammen. Versende nicht für eine Instance Separate x-, y- Koordinaten, direction, sprite_index, Waffendaten, etc. sondern stopfe sie in einen String wie diesen:
      --------------------------------------------------------
      120|338|-2.1|0.4|201|f|k|549749
      --------------------------------------------------------
      dann verschicke den codierten String. Es ist immer schneller ein Paket auf dieser Weise zu codieren und decodieren, als separate Daten zu senden.

      Das bedeutet aber auch, ein Paket nicht bei jedem Stepp zu versenden, das sind eindeutig zu viele Nachrichten. Eine Faustregel ist, für jeden Spieler 4 Pakete pro Sekunde bei Internet-spielen, 6-8 Pakete, wenn jeder eine schnelle Verbindung besitzt, und 10-15 bei einem LAN Spiel zu versenden.

      Mache jedes Paket so klein wie möglich
      Sende nur die Informationen die du senden musst. Das muss reichen.

      Fortgeschrittene Verbindungsüberwachungen
      Der Script ,der die zu versendeten Paketmengen überwacht, sollte allgemein arbeiten, du kannst aber deinem Spiel erlauben ,diese Verbindung zu überwachen, und mehr Pakete zu schicken wenn sie gut ist, und weniger Pakete wenn sie schlecht ist. Um das zu tun, muss der Host den ping überwachen, oder die Zeit einer Nachrichtenrundsendung für jeden Spieler wissen.

      Das erste, was du wissen musst, wenn du diese benutzt ist, dass der Client Computer nur auf Pakete des Host antwortet. Siehst du die letzte Nummer am Ende des Beispielpaketes oben? Das zeigt die current_time Variable (Millisekunden seit Systemstart) des Hosts zu der Zeit, als das Paket gesendet wurde. Jedes mal wenn der Host ein Paket sendet, fügt er die Systemzeit am Ende zu. Wenn ein Client ein Paket erhält, nimmt er diesen Zeitstempel und fügt dem rücksendenden Paket die eigenen Daten hinzu.

      Wenn nun das Clienten Paket zum Host zurückkommt, subtrahiert der Host einfach den Zeitstempel der vergangenen Zeit, um herauszufinden, wie lange die Sendung brauchte. Wenn der langsamste Spieler eine Rundsendungszeit von 200ms hat, dann kann der Host ihm alle 200ms ein Paket schicken (5pro Sekunde). Wenn jeder Spieler eine gute, schnelle Verbindung hat, und der langsamste ping 75ms beträgt, dann kann der Host 13 Pakete pro Sekunde. senden.

      Die gute Sache an dieser Methode ist, das der Client Computer keine Daten sendet, solange der Host nicht danach fragt, und so kann der Kanal nie überladen werden.

      Bewegungs- Vorraussagen
      4 Pakete pro Sekunde?!? Wird das nicht schrecklich ruckelig? Ja, würde es, wenn du nicht mehr tust, als das Spieler Objekt an einen bestimmten Punkt zu bewegen, und es dort lässt, bis das nächste Paket eintrifft und es dann abrupt zum nächsten Punkt bewegst. Was du brauchst, wenn du die Rate der Sendungen verringerst, ist eine Voraussage, wie die nächste Bewegung des Objektes wohl aussehen würde, und es schon in diese Richtung bewegen. Subtrahiere einfach die vorherige Position von der aktuellen, und dividiere sie durch die vergangene Zeit, und du bekommst den speed. Dann lass das Objekt kontinuierlich diese Geschwindigkeit beibehalten, bis das nächste Paket eintrifft. Oft wirst du die Menge der vorrausgesagten Bewegungen leicht reduzieren wollen, um ein besseres Ergebnis zu bekommen.

      Du kannst natürlich auch den hspeed und vspeed in jedem Paket senden, doch es ist besser, diese mit einem Code zu berechnen, weil eine kleinere Paketgröße bedeutet, dass du mehr Pakete pro Sekunde senden kannst. Natürlich ist das abhängig von der Art des Spieles, das du hast, manchmal ist es vielleicht besser, den speed in einem Paket zu haben.
      Probier es aus.

      Original:
      :) Nobody is perfect (-:

      "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
    • wow, eingies könnte ich wirklich davon gebrauchen, besonders das mit der Bewegungs- Vorraussagung, das könnte ich gut in BLD gebrauchen!
      Achja könnte einer noch ein sehr guten ping example machen, wenn wir hier schon dabei sind^^? Mein ping objekt läuft momentan nur auf steps(z.b. : 20Steps braucht ein packet hin und zurück) aber möchte es gern auf ms bereich haben und es sollte so wenig wie möglich den "Kanal" belasten^^



      Edit: Kennt jemand nochmehr solche tips über Internet-Gameprogramierung?
      *gähn*

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von The_Shadow3 ()

    • hey leute!
      das is zwar alles hilfreich, aber ich habe da trotzdem mal eine frage:
      ich kriege es einfach nicht hin:
      ich will mit pc1 (master) eine kugel abfeuern, aber diese wird auch nur auf diesem einen pc erstellt und gezeichnet! was muss ich machen, damit die kugel auch auf pc2 (slave) erstellt wird!
      Bitte postet mal ein gutes beispiel weil ich bekomme es einfach nich hin!
      :(

      "Make love, not Warcraft"
    • du versendest einfach information(id) die aussagt, das pc1 schießt
      , und sendest gleichzeitig noch dir direction etc mit.

      pc2 bekommt diese information dann, und erstellt auch ein objekt z.b. Bullet mit den dircetion die er von pc1 erhalten hat.

      Mehr ist dann auch nicht^^
      *gähn*
    • Ich weis, dass das Thema uralt ist, aber ich hätte ne Frage zum Tutorial.

      Zur Bewegungs Voraussage:
      Wie müsste ich das genau machen? Ich hab das jetzt so gemacht.

      Step Event:

      GML-Quellcode

      1. player.hspeed = (player.new_x-player.x)/15
      2. player.vspeed = (player.new_y-player.y)/15

      Doch der Spieler bewegt sich dann hin und her. Hoffe, jemand kann mir helfen.

      EDIT:
      Problem gelöst. :)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Glow Dragon ()

    • Verschicke so wenig Pakete wie möglich
      Ein Paket zu verschicken dauert lange. Verknüpfe so viele Daten wie möglich zu einem Paket zusammen. Versende nicht für eine Instance Separate x-, y- Koordinaten, direction, sprite_index, Waffendaten, etc. sondern stopfe sie in einen String wie diesen:
      --------------------------------------------------------
      120|338|-2.1|0.4|201|f|k|549749
      --------------------------------------------------------
      dann verschicke den codierten String. Es ist immer schneller ein Paket auf dieser Weise zu codieren und decodieren, als separate Daten zu senden.



      Mal ne frage wie soll ich ein solches paket wider decodieren?
      Ich weiß ja nicht wie lange die zahlen(strings) sind?

      Thx für antworten
      Ich will wie mein Opa im Schlaf sterben, nicht heulend und schreiend wie sein Beifahrer.





      I am a in the GM Quiz! :heul: :vogel:

      :gmlove:

      xD
    • Habt dank mein Meister für das Antworten.

      Jedoch sagt: Wie kann ich nur den ersten string also diesem Falle nach die 120 bis zum (|) senkrechten Strich herauslesen?
      Ich freue mich immer wieder auf eure weisen mich hoffentlich bald ereilenden ratschläge und erleuchtungen.
      Ich will wie mein Opa im Schlaf sterben, nicht heulend und schreiend wie sein Beifahrer.





      I am a in the GM Quiz! :heul: :vogel:

      :gmlove:

      xD
    • Alternativ könntest du auch ein Explode Script wie bei Php verwenden.
      Link!

      Diese splittet alles durch Trennzeichen die du selbst festlegen kannst auf und speichert sie in ein sogenanntes Array. :rolleyes:

      Edit: Dies wäre aber nur sinnvoll, wenn du mit mplay arbeitest. Bei der 39dll kann man schon mehrere Pakete auf einmal so senden.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Burhan82 ()