From 3aa9fc08366c0f139820a7445172f3cd87c25878 Mon Sep 17 00:00:00 2001 From: lidgren Date: Thu, 23 Dec 2010 12:24:01 +0000 Subject: [PATCH] Remote time diff now initialized as part of handshake --- Lidgren.Network/NetConnection.Handshake.cs | 8 ++++++++ Lidgren.Network/NetConnection.Latency.cs | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Lidgren.Network/NetConnection.Handshake.cs b/Lidgren.Network/NetConnection.Handshake.cs index 612c027..bdfa5c4 100644 --- a/Lidgren.Network/NetConnection.Handshake.cs +++ b/Lidgren.Network/NetConnection.Handshake.cs @@ -82,6 +82,7 @@ namespace Lidgren.Network om.m_messageType = NetMessageType.Connect; om.Write(m_peerConfiguration.AppIdentifier); om.Write(m_peer.m_uniqueIdentifier); + om.Write((float)NetTime.Now); WriteLocalHail(om); @@ -97,6 +98,7 @@ namespace Lidgren.Network om.m_messageType = NetMessageType.ConnectResponse; om.Write(m_peerConfiguration.AppIdentifier); om.Write(m_peer.m_uniqueIdentifier); + om.Write((float)NetTime.Now); WriteLocalHail(om); @@ -136,6 +138,7 @@ namespace Lidgren.Network { NetOutgoingMessage om = m_peer.CreateMessage(0); om.m_messageType = NetMessageType.ConnectionEstablished; + om.Write((float)NetTime.Now); m_peer.SendLibrary(om, m_remoteEndpoint); InitializePing(); @@ -285,6 +288,10 @@ namespace Lidgren.Network break; case NetConnectionStatus.RespondedConnect: // awesome + + NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength); + InitializeRemoteTimeOffset(msg.ReadSingle()); + m_peer.AcceptConnection(this); InitializePing(); SetStatus(NetConnectionStatus.Connected, "Connected to " + NetUtility.ToHexString(m_remoteUniqueIdentifier)); @@ -320,6 +327,7 @@ namespace Lidgren.Network { string remoteAppIdentifier = msg.ReadString(); long remoteUniqueIdentifier = msg.ReadInt64(); + InitializeRemoteTimeOffset(msg.ReadSingle()); int remainingBytes = payloadLength - (msg.PositionInBytes - ptr); if (remainingBytes > 0) diff --git a/Lidgren.Network/NetConnection.Latency.cs b/Lidgren.Network/NetConnection.Latency.cs index f93958e..69e9038 100644 --- a/Lidgren.Network/NetConnection.Latency.cs +++ b/Lidgren.Network/NetConnection.Latency.cs @@ -16,12 +16,24 @@ namespace Lidgren.Network /// Gets the current average roundtrip time in seconds /// public float AverageRoundtripTime { get { return m_averageRoundtripTime; } } - + + // this might happen more than once + internal void InitializeRemoteTimeOffset(float remoteSendTime) + { + m_remoteTimeOffset = (remoteSendTime + (m_averageRoundtripTime / 2.0)) - NetTime.Now; + } + + /// + /// Gets local time value comparable to NetTime.Now from a remote value + /// public double GetLocalTime(double remoteTimestamp) { return remoteTimestamp - m_remoteTimeOffset; } + /// + /// Gets the remote time value for a local time value produced by NetTime.Now + /// public double GetRemoteTime(double localTimestamp) { return localTimestamp + m_remoteTimeOffset; @@ -92,14 +104,14 @@ namespace Lidgren.Network { m_remoteTimeOffset = diff; m_averageRoundtripTime = rtt * 1.15f; // initially over-estimate - m_peer.LogDebug("Initiated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + " Server time is: " + (now + diff)); + m_peer.LogDebug("Initiated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + " Remote time is: " + (now + diff)); } else { m_averageRoundtripTime = (m_averageRoundtripTime * 0.7f) + (float)(rtt * 0.3f); m_remoteTimeOffset = ((m_remoteTimeOffset * (double)(m_sentPingNumber - 1)) + diff) / (double)m_sentPingNumber; - m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + ", server time to " + (now + m_remoteTimeOffset) + " (ie. diff " + m_remoteTimeOffset + ")"); + m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + ", remote time to " + (now + m_remoteTimeOffset) + " (ie. diff " + m_remoteTimeOffset + ")"); } // update resend delay for all channels