NetEntityEvent fixes:

- comparing event data equality with Object.Equals instead of == because == returns false for boxed value types
- fixed old unacked messages not being resent if there are newer unacked messages that have been resent less than 1.5 * RTT ago
This commit is contained in:
Regalis
2017-01-03 20:10:03 +02:00
parent 1fb15f5589
commit 1eea373117
4 changed files with 45 additions and 18 deletions
@@ -54,18 +54,35 @@ namespace Barotrauma.Networking
if (events.Count == 0) return; if (events.Count == 0) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>(); List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
for (int i = events.Count - 1; i >= 0 && events[i].ID > thisClient.LastSentEntityEventID; i--)
//find the index of the first event the server hasn't received
int startIndex = events.Count;
while (startIndex > 0 &&
events[startIndex-1].ID > thisClient.LastSentEntityEventID)
{ {
startIndex--;
}
for (int i = startIndex; i < events.Count; i++)
{
//find the first event that hasn't been sent in 1.5 * roundtriptime or at all
float lastSent = 0; float lastSent = 0;
eventLastSent.TryGetValue(events[i].ID, out lastSent); eventLastSent.TryGetValue(events[i].ID, out lastSent);
//wait for 1.5f * roundtriptime until resending
if (lastSent > NetTime.Now - serverConnection.AverageRoundtripTime * 1.5f) if (lastSent > NetTime.Now - serverConnection.AverageRoundtripTime * 1.5f)
{ {
break; continue;
} }
eventsToSync.Insert(0, events[i]); eventsToSync.AddRange(events.GetRange(i, events.Count - i));
break;
}
if (eventsToSync.Count == 0) return;
//too many events for one packet
if (eventsToSync.Count > MaxEventsPerWrite)
{
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
} }
if (eventsToSync.Count == 0) return; if (eventsToSync.Count == 0) return;
@@ -45,7 +45,7 @@ namespace Barotrauma.Networking
{ {
for (int i = 0; i<Data.Length; i++) for (int i = 0; i<Data.Length; i++)
{ {
if (Data[i] != other.Data[i]) return false; if (!Data[i].Equals(other.Data[i])) return false;
} }
return true; return true;
} }
@@ -10,8 +10,8 @@ namespace Barotrauma.Networking
{ {
abstract class NetEntityEventManager abstract class NetEntityEventManager
{ {
const int MaxEventBufferLength = 1024; public const int MaxEventBufferLength = 1024;
const int MaxEventsPerWrite = 64; public const int MaxEventsPerWrite = 64;
//public UInt32 LastReceivedEntityEventID //public UInt32 LastReceivedEntityEventID
//{ //{
@@ -23,12 +23,6 @@ namespace Barotrauma.Networking
/// </summary> /// </summary>
protected void Write(NetOutgoingMessage msg, List<NetEntityEvent> eventsToSync, Client recipient = null) protected void Write(NetOutgoingMessage msg, List<NetEntityEvent> eventsToSync, Client recipient = null)
{ {
//too many events for one packet
if (eventsToSync.Count > MaxEventsPerWrite)
{
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
}
msg.Write(eventsToSync[0].ID); msg.Write(eventsToSync[0].ID);
msg.Write((byte)eventsToSync.Count); msg.Write((byte)eventsToSync.Count);
@@ -53,20 +53,36 @@ namespace Barotrauma.Networking
if (events.Count == 0) return; if (events.Count == 0) return;
List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>(); List<NetEntityEvent> eventsToSync = new List<NetEntityEvent>();
for (int i = events.Count - 1; i >= 0 && events[i].ID > client.lastRecvEntityEventID; i--)
//find the index of the first event the client hasn't received
int startIndex = events.Count;
while (startIndex > 0 &&
events[startIndex-1].ID > client.lastRecvEntityEventID)
{ {
startIndex--;
}
for (int i = startIndex; i < events.Count; i++)
{
//find the first event that hasn't been sent in 1.5 * roundtriptime or at all
float lastSent = 0; float lastSent = 0;
client.entityEventLastSent.TryGetValue(events[i].ID, out lastSent); client.entityEventLastSent.TryGetValue(events[i].ID, out lastSent);
//wait for 1.5f * roundtriptime until resending
if (lastSent > NetTime.Now - client.Connection.AverageRoundtripTime * 1.5f) if (lastSent > NetTime.Now - client.Connection.AverageRoundtripTime * 1.5f)
{ {
break; continue;
} }
eventsToSync.Insert(0, events[i]); eventsToSync.AddRange(events.GetRange(i, events.Count - i));
break;
} }
if (eventsToSync.Count == 0) return; if (eventsToSync.Count == 0) return;
//too many events for one packet
if (eventsToSync.Count > MaxEventsPerWrite)
{
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
}
foreach (NetEntityEvent entityEvent in eventsToSync) foreach (NetEntityEvent entityEvent in eventsToSync)
{ {