Exemplo n.º 1
0
        private void HandleTimeSyncReponse(TeleportReader reader)
        {
            var clientTimeOnRequestSent     = reader.ReadSingle();
            var serverTimeOnRequestArrival  = reader.ReadSingle();
            var clientTimeOnResponseArrival = LocalTime;
            var totalRoundtripDuration      = clientTimeOnResponseArrival - clientTimeOnRequestSent;
            var estimatedReturnTripDuration = totalRoundtripDuration * 0.5f;
            var estimatedServerTime         = serverTimeOnRequestArrival + estimatedReturnTripDuration;
            var delta     = estimatedServerTime - ServerTime;
            var absDelta  = Math.Abs(delta);
            var deltaSign = Math.Sign(delta);

            IsTimeSynchronized = true;
            State = StateType.Connected;
            if (absDelta > TIME_SYNC_MAX_TIME_DRIFT_BEFORE_HARD_SET_IN_SECONDS)
            {
                ServerTime = estimatedServerTime;
            }
            else
            {
                ServerTime += Math.Max(absDelta, TIME_SYNC_MAX_TIME_DRIFT_MAGNITUDE) * deltaSign;
            }
        }
Exemplo n.º 2
0
        private void HandleTimeSyncReponse(TeleportReader reader)
        {
            _isWaitingForTimesync = false;
            bool shouldNotifyReady           = !IsTimeSynchronized;
            var  clientTimeOnRequestSent     = reader.ReadSingle();
            var  serverTimeOnRequestArrival  = reader.ReadSingle();
            var  clientTimeOnResponseArrival = LocalTime;
            var  totalRoundtripDuration      = clientTimeOnResponseArrival - clientTimeOnRequestSent;

            _lastKnownPing = Mathf.CeilToInt(totalRoundtripDuration * 1000);
            if (totalRoundtripDuration > TIME_SYNC_MAX_RESPONSE_DELAY)
            {
                Debug.LogWarning("Ignoring timesync response, took too long. RTT: " + totalRoundtripDuration);
                return;
            }
            var estimatedReturnTripDuration = totalRoundtripDuration * 0.5f;
            var estimatedServerTime         = serverTimeOnRequestArrival + estimatedReturnTripDuration;
            var delta     = estimatedServerTime - ServerTime;
            var absDelta  = Math.Abs(delta);
            var deltaSign = Math.Sign(delta);

            IsTimeSynchronized = true;
            State = StateType.Connected;
            if (absDelta > TIME_SYNC_MAX_TIME_DRIFT_BEFORE_HARD_SET_IN_SECONDS)
            {
                ServerTime = estimatedServerTime;
            }
            else
            {
                ServerTime += Math.Max(absDelta, TIME_SYNC_MAX_TIME_DRIFT_MAGNITUDE) * deltaSign;
            }
            if (shouldNotifyReady)
            {
                SendClientReady();
            }
        }
Exemplo n.º 3
0
 public override void Deserialize(TeleportReader reader)
 {
     Timestamp = reader.ReadSingle();
     base.Deserialize(reader);
 }
Exemplo n.º 4
0
        private void ReplyToTimeSyncRequest(EndPoint sender, TeleportReader reader)
        {
            var clientTime = reader.ReadSingle();

            SendToEndpoints((w) => SerializeTimeSyncResponse(w, clientTime), 0, sender);
        }