Skip to content
This repository has been archived by the owner on Sep 14, 2022. It is now read-only.

Commit

Permalink
- Fixed the simulation for dropping reliable packets by adding additi…
Browse files Browse the repository at this point in the history
…onal latency to it

- Fixed release build checks
- Code restructured
  • Loading branch information
TiToMoskito committed Jan 16, 2022
1 parent 464bdaa commit 929fbda
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 29 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,8 @@
1.0.1
- Added a Enabled variable, to enable or disable the simulation
- Added a check if it accidentally was put in a release build (Thanks to Punfish)
- Code cleaned
- Code cleaned
1.1.0
- Fixed the simulation for dropping reliable packets by adding additional latency to it
- Fixed release build checks
- Code restructured
90 changes: 63 additions & 27 deletions FishyLatency.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,18 @@ public class FishyLatency : Transport
[SerializeField] Transport m_transport;

[Header("Settings")]
[Tooltip("Enable or disable the simulation")]
[SerializeField] bool m_enabled = true;

[Tooltip("Additional amount of latency for all packets")]
[Range(0, 1)]
[SerializeField] float m_latency = 0f;

[Tooltip("Additional amount of latency for reliable packets only when a packet get's lossed!")]
[Range(0, 1)]
[SerializeField] float m_latency = 0f;
[SerializeField] float m_reliableLatency = 0.2f;

[Tooltip("How many % should be a packet loss")]
[Range(0, 1)]
[SerializeField] double m_packetloss = 0;
#endregion
Expand Down Expand Up @@ -47,6 +56,11 @@ public ArraySegment<byte> GetSegment()
{
return new ArraySegment<byte>(message, 0, length);
}

public void AddLatency(float latency)
{
this.time += latency;
}
}

private readonly System.Random m_random = new System.Random();
Expand All @@ -64,14 +78,6 @@ public override void Initialize(NetworkManager networkManager)
m_transport.OnRemoteConnectionState += OnRemoteConnectionState;
m_transport.OnClientReceivedData += OnClientReceivedData;
m_transport.OnServerReceivedData += OnServerReceivedData;
#if UNITY_EDITOR || DEVELOPMENT_BUILD
InstanceFinder.TimeManager.OnPreTick += OnPreTick;
#endif
}

private void OnPreTick()
{
Simulation();
}

private void OnDestroy()
Expand Down Expand Up @@ -152,7 +158,11 @@ public override void IterateIncoming(bool server)
/// <param name="server">True to process data received on the server.</param>
public override void IterateOutgoing(bool server)
{

#if UNITY_EDITOR || DEVELOPMENT_BUILD
Simulation(server);
#else
m_transport.IterateOutgoing(server);
#endif
}
#endregion

Expand Down Expand Up @@ -336,8 +346,6 @@ public override void Shutdown()
m_transport.OnServerReceivedData -= OnServerReceivedData;

#if UNITY_EDITOR || DEVELOPMENT_BUILD
InstanceFinder.TimeManager.OnPreTick -= OnPreTick;

m_clientToServerMessages.Clear();
m_serverToClientMessages.Clear();
#endif
Expand Down Expand Up @@ -385,32 +393,60 @@ private void Add(byte channelId, ArraySegment<byte> segment, bool server = false
m_clientToServerMessages.Add(new Message(channelId, connectionId, segment, m_latency));
}

private void Simulation()
private void Simulation(bool server)
{
// Packet drop
if (m_packetloss > 0 && m_random.NextDouble() < m_packetloss) return;
if(server)
{
for (int i = 0; i < m_serverToClientMessages.Count; i++)
{
if (CheckReliablePacketLoss(m_serverToClientMessages[i]))
break;

for (int i = 0; i < m_clientToServerMessages.Count; i++)
if (m_serverToClientMessages[i].time <= Time.time)
{
m_transport.SendToClient(m_serverToClientMessages[i].channelId, m_serverToClientMessages[i].GetSegment(), m_serverToClientMessages[i].connectionId);
m_serverToClientMessages.RemoveAt(i);
}
}
}
else
{
if (m_clientToServerMessages[i].time <= Time.time)
for (int i = 0; i < m_clientToServerMessages.Count; i++)
{
m_transport.SendToServer(m_clientToServerMessages[i].channelId, m_clientToServerMessages[i].GetSegment());
m_clientToServerMessages.RemoveAt(i);
if (CheckReliablePacketLoss(m_clientToServerMessages[i]))
break;

if (m_clientToServerMessages[i].time <= Time.time)
{
m_transport.SendToServer(m_clientToServerMessages[i].channelId, m_clientToServerMessages[i].GetSegment());
m_clientToServerMessages.RemoveAt(i);
}
}
}
m_transport.IterateOutgoing(false);
m_transport.IterateOutgoing(server);
}

for (int i = 0; i < m_serverToClientMessages.Count; i++)
private bool CheckReliablePacketLoss(Message msg)
{
if (CheckPacketLoss())
{
if (m_serverToClientMessages[i].time <= Time.time)
{
m_transport.SendToClient(m_serverToClientMessages[i].channelId, m_serverToClientMessages[i].GetSegment(), m_serverToClientMessages[i].connectionId);
m_serverToClientMessages.RemoveAt(i);
if (msg.channelId == GetDefaultReliableChannel())
{
msg.AddLatency(m_reliableLatency);
return false;
}
return true;
}
else
{
return false;
}
m_transport.IterateOutgoing(true);
}


private bool CheckPacketLoss()
{
return m_packetloss > 0 && m_random.NextDouble() < m_packetloss;
}
#endregion
}
}
2 changes: 1 addition & 1 deletion VERSION.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.1
1.1.0

0 comments on commit 929fbda

Please sign in to comment.