Ich denke, es ist definitiv nicht in Ordnung, die Uhr im System zu synchronisieren . Der Benutzer erwartet nicht, dass Sie die Systemeinstellungen berühren, und viele Systeme lassen dies nicht einmal zu.
Alles, was Sie brauchen, ist eine Korrelation, um den Zeitstempel von der Uhr einer Seite in die Uhr der anderen Seite umzuwandeln. Andererseits muss diese Korrelation ziemlich genau sein, etwa bis zu einer Hundertstelsekunde, wenn Sie sie zur Vorhersage der Spielerpositionen verwenden möchten. Die Systemuhr wird niemals so gut zwischen zufälligen Maschinen korrelieren. Daher sollten Sie die Korrelation selbst herstellen und dabei einige Variationen des NTP- Themas verwenden, die wahrscheinlich in Ihre anderen Nachrichten eingebettet sind, um die Netzwerkbandbreite zu schonen.
Die Grundidee könnte sein, dass Sie mit jedem Paket, das Sie gesendet haben, den Zeitstempel gesendet haben und die Sequenznummer und den Zeitstempel, als Sie das letzte Paket von der anderen Seite empfangen haben. Daraus berechnen Sie den Roundtrip: Wenn beispielsweise Paket Q angibt, dass es um 1000 gesendet wurde und Paket P mit 500 empfangen wurde, als wenn Sie Paket P mit 0 gesendet haben und Q mit 800 empfangen, beträgt der Roundtrip (800 - 0) ) - (1000 - 500) = 300. Es gibt keine Möglichkeit, die Assymetrie zu kennen. Sie nehmen also einfach an, dass das Paket die Hälfte (150) Ticks in beide Richtungen benötigt. Und dieser entfernte Zeitstempel liegt um 1000 - (800 - 150) = 350 Ticks vor dem lokalen. Die Hin- und Rückfahrt variiert. Wenn Sie davon ausgehen, dass die Uhr ziemlich genau ist, sollten Sie einen langfristigen Durchschnitt der Korrelation verwenden.
Beachten Sie, dass Sie die Systemuhr auch nicht für die Uhr verwenden möchten. Sie werden möglicherweise auf halbem Weg neu synchronisiert, was Sie aus der Bahn wirft. Sie sollten clock(CLOCK_MONOTONIC)
unter Unix oder GetTickCount
Windows verwenden (nicht sicher, wie diese APIs derzeit in Java oder Python eingeschlossen sind).
Hinweis: Die SO_TIMESTAMP
Socket-Option (siehe Socket (7) , der von ott-- im Kommentar zur Frage erwähnt wird) ist nützlich, um den Effekt der Latenz der Ereignisschleife, die die Pakete empfängt, herauszufiltern. Ob sich die Mühe lohnt, hängt davon ab, wie genau Sie sind.