Ich habe 2 bis 3 Clients, die Nachrichten über das Apple Game Center austauschen können.
Die einzige Synchronisation, die ich brauche, ist: Starten Sie das Spiel im selben Moment.
Ich denke, dies beinhaltet eine Uhrensynchronisation. Wie kann man das erreichen?
networking
multiplayer
game-center
GameCoder
quelle
quelle
now
und Sie eine Nachricht senden, um genaunow + halfSecond
dann zu beginnen , werden alle zur gleichen Zeit gestartet, solange alle die Nachricht innerhalb einer halben Sekunde empfangen und ihre Systemuhren korrekt synchronisiert sind.Antworten:
Stevens Kommentar ist richtig: Dies ist theoretisch unmöglich zu tun.
Glücklicherweise kann man in der Praxis nah dran sein, so funktionieren Dinge wie NTP .
Besser als nur eine Nachricht an 3 Clients mit der Aufschrift "Jetzt starten" zu senden, können Sie vorab einige Ping-Nachrichten austauschen, um die Zeit zu messen, die erforderlich ist, um eine Nachricht an den Client zu senden, und wenn Sie die Startnachricht senden. Anstelle von "Jetzt starten" sagen Sie "In X Millisekunden starten" und passen X an die unterschiedlichen Zeiten an, zu denen eine Nachricht eintrifft.
z.B.:
Dies kann keine Synchronisierung garantieren, da die zum Senden einer Nachricht über das Internet benötigte Zeit unterschiedlich ist und in jeder Richtung unterschiedlich sein kann. Zum einen können Sie die Auswirkungen reduzieren, indem Sie die Messung mehrmals durchführen und einen Medianwert ablesen. Der zweite ist schwieriger und möglicherweise theoretisch unmöglich zu lösen (obwohl ich mich momentan nicht an den Beweis erinnern kann). Die gute Nachricht ist, dass Sie wahrscheinlich nicht so viel Genauigkeit benötigen.
quelle
Wie bereits erwähnt, ist dies unmöglich, daher würde ich einen anderen Ansatz ausprobieren:
Wenn Sie keinen dedizierten Server haben, wählen Sie einen teilnehmenden Client als Host aus (dieser kann bei Bedarf übertragen werden).
Der Host führt nun alle wichtigen Spielelogiken wie Treffererkennung, KI-Steuerung, Inventarverwaltung usw. sowie Zeiterfassung (dh Diktieren der Spielzeit) aus.
Die anderen Clients versuchen lediglich, mit dem Host synchron zu bleiben und den erwarteten Wert zu schätzen oder zu approximieren. Wenn die Verzögerung zunimmt oder ein Paketverlust auftritt, werden die Dinge möglicherweise unruhig, aber es ist trivial, aufzuholen und im Wesentlichen nur auf das nächste Update zu warten.
Die meisten Spiele (insbesondere FPS) verbergen diese Tatsache, indem sie ihre eigene lokale Berechnung für die eigene Bewegung des Spielers, abgefeuerte Schüsse usw. durchführen, um zu vermeiden, dass sich das Spiel verzögert anfühlt. Alles wird immer noch basierend auf Serverdaten korrigiert. Dies kann zu Verwirrung führen, z. B. wenn Sie sehen, wie Sie den Feind erschießen, aber im selben Moment, in dem Sie tot umfallen (ohne dass der Feind einen Treffer erzielt), ist dies jedoch ein weitaus besserer Ansatz als die vollständige Synchronisierung.
Wenn Sie immer noch darauf bestehen, alles synchron zu halten, möchten Sie wahrscheinlich eine Art Schritt- oder Frame-Zähler erstellen, sodass alle Clients nur einen logischen Schritt verarbeiten und dann ihre Daten usw. synchronisieren. Beachten Sie, dass dies beide Bandbreiten sein können intensiv und verzögert, daher würde ich dies nicht empfehlen, es sei denn, Sie haben ansonsten viele Daten und Ihr Gameplay ist rundenbasiert (z. B. Spiele im Artillerie- / Worms-Stil).
quelle
Ich empfehle, System-Timer auf allen Clients und dem Server mithilfe des NTP-Protokolls [Stratum 2] zu synchronisieren. Anschließend sendet der Server einen Befehl, um das Spiel zum angegebenen Zeitpunkt zu starten, beispielsweise wenn alle Timer 0:05:00 erreichen. Dieser Ansatz sollte Ihnen 3-4 ms genaue Synchronisation geben, glaube ich.
quelle