winsock clients synchronisieren



  • halli hallo,

    ich bin gerade dabei, meinen alten Snake-Clone netzwerkfähig zu machen und stoße auf diverse Synchonisationsprobleme der Clients, weil mir derzeit noch nicht 100% klar ist, welche Dinge vom Server und welche vom Client erledigt werden müssen, damit bei allen das gleiche auf dem Monitor erscheint.

    momentaner Stand:

    Person 1 erstellt Server.
    Person 1 erstellt Client und connectet zum Server.
    Person 2 erstellt Client und connectet zum Server.

    Wird das Spiel gestartet, so sendet JEDER Client im 20ms Rhythmus die Richtung, in die die Schlange laufen soll.
    Der Server macht derzeit nichts weiter, als die Daten direkt an alle anderen Clients weiterzuleiten. Diese speichern die neue Laufrichtung ab.

    Im Snake-Spiel selbst läuft über ein WM_TIMER - Ereignis alle 125ms die Routine, um die Schlange jeder Person um 1 Feld vorzubewegen. Hier wird auf die aktuelle Laufrichtung zurückgegriffen. Bei der 2. Person also auf die Daten, die über das Netzwerk kommen.

    Hier verläuft sich logischerweiße so einiges. Ab und zu kommt es vor, dass bei Person 2 die Schlange um ein Feld zu spät abbiegt.

    Meine Idee wäre, alle Daten an den Server zu senden... dieser berechnet alles und liefert die gleichen Daten an alle Clients. Bevor ich aber nun anfange, alles umzubauen, würde ich gern wissen, wie Ihr oder andere das machen, damit auf allen PC's zur gleichen Zeit die gleichen Daten vorhanden sind.

    Vielen Dank schonmal.



  • Schau dir mal diesen Artikel an:

    http://www.gamasutra.com/features/19970905/ng_01.htm

    Kurz zusammen gefasst. Niemals irgendwelche inkrementellen Updates senden. Immer den kompletten Status. Diesen Status kannst du ja leicht durch die aktuelle Richtungsinformation ergänzen, so dass der Client erstmal weiter rechnen kann. Außerdem musst du ja nur eine Aktualisierung senden, wenn deine Schlange die Richtung wechselt.



  • ich habe mir den Artikel mal zu Gemüte geführt und trotz meiner bescheidenen Englischkenntnisse auch einigermaßen verstanden.

    ProgChild schrieb:

    Außerdem musst du ja nur eine Aktualisierung senden, wenn deine Schlange die Richtung wechselt.

    Das hab ich schonmal beherzigt. Ich hab den 20 ms Rhythmus herausgeschmissen und sende nur noch die Information des Laufrichtungswechsels, wenn dieser auch stattfindet.

    Desweiteren läuft der WM_TIMER nur noch auf dem Client, wo auch der Server erstellt wurde. Wurde das WM_TIMER-Ereignis durchgeführt, sende ich ein Flag über das Netzwerk zu dem anderen Client, der dann hier erst die Berechnung durchführt. Nach einigen Test scheint das Problem der Synchonisation wohl erstmal behoben. Es wird sich zeigen, ob das Spiel mit zunehmender Geschwindigkeit auch damit zurechtkommt.

    ProgChild schrieb:

    Niemals irgendwelche inkrementellen Updates senden. Immer den kompletten Status.

    😕 das versteh ich irgendwie nicht so ganz. Welcher Status ist hiermit gemeint? Der Status im Spiel? Vielleicht kannst das ja noch etwas genauer erklären 🤡



  • BasicMan01 schrieb:

    ProgChild schrieb:

    Niemals irgendwelche inkrementellen Updates senden. Immer den kompletten Status.

    😕 das versteh ich irgendwie nicht so ganz. Welcher Status ist hiermit gemeint? Der Status im Spiel? Vielleicht kannst das ja noch etwas genauer erklären 🤡

    Ich versuchs mal an einem Beispiel zu erklären 😃

    Also stellen wir uns vor, es existieren zwei Spieler auf je zwei Computern, die über das Netzwerk synchronisiert werden sollen. Jeder von den Spielern hat als Informationen (Position, Richtung, Geschwindigkeit) .

    Würden wir jetzt jedes mal, wenn Spieler A seine Geschwindigkeit oder Richtung ändert nur diese Information übertragen, so könnten natürlich theoretisch beide Spiele parallel ablaufen. Aber genau das tun sie nicht. Eben weil es gewisse Verzögerungen in der Übertragung gibt.

    Was wir eigentlich übertragen wollen ist ja, wo sich der Spieler befindet. Die Informationen Geschwindigkeit und Richtung geben inkrementelle Aktualisierungen der Position des Spielers an, denn sie sorgen dafür, dass die Position des Spielers schrittweise aktualisiert wird. Wir interessieren uns also für die Position des Spielers. Also übertragen wir die Position des Spielers immer absolut (d.h. die kompletten absoluten Koordinaten).

    Wenn wir aber nur diese Informationen haben, würde unser Spiel ganz schön ruckeln, wenn in jedem Frame die Position beider Spieler übertragen werden muss. Dies lösen wir jetzt, indem wir noch zusätzlich die Informationen über Geschwindigkeit und Richtung übertragen. So können wir das Spiel auf beiden Rechnern weiter laufen lassen, bis die nächste Aktualisierung kommt.

    Wenn wir es ganz exakt machen wollen, können wir auch noch die Information übertragen, zu welchem Zeitpunkt sich der Spieler an der gewissen Position befunden hat, so dass, wenn uns die Information verzögert erreicht, wir errechnen können, wo sich der Spieler jetzt befinden müsste, wenn keine weiteren Aktualisierungen angekommen sind. Das bedeutet aber, dass man irgendwie zwei synchronisierte Uhren haben muss.

    Ich hoffe, das war jetzt ein wenig Verständlicher. 🙂



  • 😉 Hey super, das hab ich verstanden.

    vielen Dank


Anmelden zum Antworten