dümmler: online game - verständisfrage

Hallo,
ich habe eine Verständnisfrage bezüglich der Technik von sogenannten OnlineGames, genauer Multiplayer-Shooter wie z.b. Battlefield. wie läuft das da mit der Datenübertragung...
Konkrete Fragen:

0)  werden z.b. meine Koordinaten permanent in eine zentrale DB übertragen (zb. via UDP) und die anderen Nutzen rufen stetig diese Daten ab?

  1. bleibt die Verbindung offen, oder muss ich mich immer wieder neu verbinden?
    (a la http)

  2. welches Netzwerkprotokoll wird dafür genutzt? TCP/IP, UDP...?

  3. in welchen Intervallen werden die Daten gesendet? Diese müssen ja extrem klein sein.

  4. würde man sowas (ähnliches, nur sehr viel simpler) mit Ajax umsetzen: wäre das technisch möglich, oder wären die Intervalle so klein, dass es Probleme geben könnte?

  5. ich würde sowas gerne mal mit java-applets ausprobieren. Wie wäre am besten der Versuchsaufbau? (z.b. zentrales Python-Skript, welches die Daten entgegennimmt und in eine DB spielt bzw. ausgibt, Applet n, welches diesem Skript die Daten übergibt bzw. entgegennimmt.)

danke für eure antworten

  1. 0)  werden z.b. meine Koordinaten permanent in eine zentrale DB übertragen (zb. via UDP) und die anderen Nutzen rufen stetig diese Daten ab?

    Das ist meistens nicht notwendig, da aufgrund bestimmter Faktoren die möglichen zukünftigen Punkte vorhersagbar sind. Wenn eine Figur seint 10 Meter gerade aus läuft, wird sie das möglicherweise auch die Nächsten 2 Meter machen.

    Der Netcode moderner Shooter beinhaltet hier z.B. auch übliche Bewegungsmuster um solche vorhersagen zu treffen damit auch im fall von höheren Latenzen die Bewegung flüssig erscheint.

    Wenn das schief geht, erkennt man das daran, dass die Spielfiguren ruckeln.

    1. bleibt die Verbindung offen, oder muss ich mich immer wieder neu verbinden?

    Du meinst "Zustandslosigkeit" - das ist häufig so, ja.

    1. welches Netzwerkprotokoll wird dafür genutzt? TCP/IP, UDP...?

    Wenn man es auf einem niedrigen Level betrachtet UDP - aber üblicherweise verwendet man hierzu heute APIs wie z.B. DirectPlay:

    1. in welchen Intervallen werden die Daten gesendet? Diese müssen ja extrem klein sein.

    Nicht notwendigerweise - wenn zwei Spielfiguren so weit voneinander entfernt sind, dass sie unmöglich miteinander interagieren, müssen auch die Positionen und Handlungsinformationen nicht ausgetauscht werden. Das ist etwa so wie bei der Sichtbarkeitsbereichtung in der Darstellung - die Karten werden z.B. in Binärbäume zerlegt und es werden nur Informationen getauscht, die tatsächlich relevant sind.

    1. würde man sowas (ähnliches, nur sehr viel simpler) mit Ajax umsetzen: wäre das technisch möglich, oder wären die Intervalle so klein, dass es Probleme geben könnte?

    Sollte theoretisch ohne Probleme funktionieren - die Latenzen bei HTTP sind halt etwas "unberechnenbar".

    1. ich würde sowas gerne mal mit java-applets ausprobieren. Wie wäre am besten der Versuchsaufbau? (z.b. zentrales Python-Skript, welches die Daten entgegennimmt und in eine DB spielt bzw. ausgibt, Applet n, welches diesem Skript die Daten übergibt bzw. entgegennimmt.)

    Bez. Java fragst du den falschen :)

  2. Hallo,

    1. würde man sowas (ähnliches, nur sehr viel simpler) mit Ajax umsetzen: wäre das technisch möglich, oder wären die Intervalle so klein, dass es Probleme geben könnte?

    Das ist ohne Probleme möglich, ich und mein Bruder arbeiten zur zeit an einem Multiplayer-Browsergame, allerdings benutzen wir nicht ajax sondern websockets (wenn sie verfügbar sind) mit http://socket.io/.

    Wir haben auch ein anderes Projekt gefixt, um zu gucken ob das mit der synchronisation über Netzwerk sinnvoll funktionieren kann und es lief sehr zufriedenstellend https://github.com/logsol/box2dweb-network-synchronisation, man kann mehrere Fenster aufmachen und alles läuft ziemlich synchron. Wir nutzen dabei die Physic-Engine lokal um die Zwischenschritte zu berechnen und ab und zu mal kommt der Server und berichtigt die informationen so dass bei allen das Spiel gleich aussieht.

    Und last but not least muss ich hier mal Werbung für meine Bachelorarbeit machen A Generic Game Server, in der wir untersucht haben ob man Spieleserver auch ausfallsicher betreiben kann. (Wir haben dafür ein sehr gut kassiert ;-) )

    Jeena

  3. hi,

    Hallo,
    ich habe eine Verständnisfrage bezüglich der Technik von sogenannten OnlineGames, genauer Multiplayer-Shooter wie z.b. Battlefield. wie läuft das da mit der Datenübertragung...
    Konkrete Fragen:

    0)  werden z.b. meine Koordinaten permanent in eine zentrale DB übertragen (zb. via UDP) und die anderen Nutzen rufen stetig diese Daten ab?

    Das Abspeichern macht nur sinn, wenn man die Daten mehrfach aufrufen möchte und das nach langer Zeit noch. In dem Fall hier, wäre das nicht der Fall. Da reicht es aus, die Infos in den Arbeitsspeicher zu schreiben. Deswegen laufen ja die Server dauerhaft. Diese halten alle Informationen bereit. Stürzen sie ab, sind die infos weg, aber dann braucht sie ja auch keiner mehr!

    1. bleibt die Verbindung offen, oder muss ich mich immer wieder neu verbinden?
      (a la http)

    2. welches Netzwerkprotokoll wird dafür genutzt? TCP/IP, UDP...?

    3. in welchen Intervallen werden die Daten gesendet? Diese müssen ja extrem klein sein.

    Das wurde von suit glaub ich grade schon erklärt. Wichtig ist zu wissen, dass nicht alle Pakete notwendig sein dürfen und keine Überprüfung des Senders notwendig ist. Man sendet alle Infos so schnell es eben geht an den den Server und bekommt Infos. Daten die nicht immer ankommen müssen. Werden nicht überprüft (rückmeldung das erhalten). Bei anderen Daten wie "du hast verlohren" muss es natürlich ankommen. Daher ist das etwas gemischt in der Übertragung. Umso weniger Pakete aber ankommen, umso schwerer wird es das ganze fair zu gestalten. Wenn nur jede sekunde 2 pakete durch kommen würde, kann man nie genau sagen, wo die person grade sein müsste.

    1. würde man sowas (ähnliches, nur sehr viel simpler) mit Ajax umsetzen: wäre das technisch möglich, oder wären die Intervalle so klein, dass es Probleme geben könnte?

    In meinen Augen wäre das deutlich zu langsam. AJAX läuft über HTTP, dieses Protokoll ist zu langsam und vorallem schließt es nach Anfrage - Antwort sofort wieder ab. Dauerhafte Verbindungen sind damit nicht sinnvoll möglich.

    1. ich würde sowas gerne mal mit java-applets ausprobieren. Wie wäre am besten der Versuchsaufbau? (z.b. zentrales Python-Skript, welches die Daten entgegennimmt und in eine DB spielt bzw. ausgibt, Applet n, welches diesem Skript die Daten übergibt bzw. entgegennimmt.)

    Java ist hier der richtige Ansatz.
    Mit etwas übung, kann man sich einen eigenen Server in Java schreiben, der die ganze Komunikation übernimmt und schlank genug ist für das ganze. Java kann zudem dauerhaft laufen und die einzelnen Spieler gut verbinden.

    Gruß Niklas

    P.S.: ein Tetris-Battle könnte ich mir grade noch so mit Ajax vorstellen ;)

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Hallo,

      Stürzen sie ab, sind die infos weg, aber dann braucht sie ja auch keiner mehr!

      Naja ich sehe ich anders, es ist ja durchaus möglich zu verhindern dass die infos weg sind, man muss nur einen backupserver mitlaufen lassen der die Arbeit dann übernimmt und den ersten server neu startet und diesen dann als backup-server nutzt.

      Jeena

      1. hi,

        Hallo,

        Stürzen sie ab, sind die infos weg, aber dann braucht sie ja auch keiner mehr!
        Naja ich sehe ich anders, es ist ja durchaus möglich zu verhindern dass die infos weg sind, man muss nur einen backupserver mitlaufen lassen der die Arbeit dann übernimmt und den ersten server neu startet und diesen dann als backup-server nutzt.

        Jeena

        Joar, aber das sprengt wohl den hier gefragten rahmen erst mal xD

        Gruß Niklas

        --
        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.