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

View File

@@ -54,18 +54,35 @@ namespace Barotrauma.Networking
if (events.Count == 0) return;
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;
eventLastSent.TryGetValue(events[i].ID, out lastSent);
//wait for 1.5f * roundtriptime until resending
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;

View File

@@ -45,7 +45,7 @@ namespace Barotrauma.Networking
{
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;
}

View File

@@ -10,8 +10,8 @@ namespace Barotrauma.Networking
{
abstract class NetEntityEventManager
{
const int MaxEventBufferLength = 1024;
const int MaxEventsPerWrite = 64;
public const int MaxEventBufferLength = 1024;
public const int MaxEventsPerWrite = 64;
//public UInt32 LastReceivedEntityEventID
//{
@@ -23,12 +23,6 @@ namespace Barotrauma.Networking
/// </summary>
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((byte)eventsToSync.Count);

View File

@@ -53,20 +53,36 @@ namespace Barotrauma.Networking
if (events.Count == 0) return;
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;
client.entityEventLastSent.TryGetValue(events[i].ID, out lastSent);
//wait for 1.5f * roundtriptime until resending
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;
//too many events for one packet
if (eventsToSync.Count > MaxEventsPerWrite)
{
eventsToSync.RemoveRange(MaxEventsPerWrite, eventsToSync.Count - MaxEventsPerWrite);
}
foreach (NetEntityEvent entityEvent in eventsToSync)
{