//Update function private void UpdateLogic() { List <NetPeer> peersToRemove = new List <NetPeer>(); while (IsRunning) { long startTime = DateTime.UtcNow.Ticks; #if DEBUG if (SimulateLatency) { var time = DateTime.UtcNow; lock (_pingSimulationList) { for (int i = 0; i < _pingSimulationList.Count; i++) { var incomingData = _pingSimulationList[i]; if (incomingData.TimeWhenGet <= time) { DataReceived(incomingData.Data, incomingData.Data.Length, incomingData.EndPoint); _pingSimulationList.RemoveAt(i); i--; } } } } #endif #if STATS_ENABLED ulong totalPacketLoss = 0; #endif //Process acks for (var netPeer = _peers.HeadPeer; netPeer != null; netPeer = netPeer.NextPeer) { if (netPeer.ConnectionState == ConnectionState.Disconnected) { peersToRemove.Add(netPeer); } else { netPeer.Update(UpdateTime); #if STATS_ENABLED totalPacketLoss += netPeer.Statistics.PacketLoss; #endif } } _peers.RemovePeers(peersToRemove); peersToRemove.Clear(); #if STATS_ENABLED Statistics.PacketLoss = totalPacketLoss; #endif int sleepTime = UpdateTime - (int)((DateTime.UtcNow.Ticks - startTime) / TimeSpan.TicksPerMillisecond); if (sleepTime > 0) { Thread.Sleep(sleepTime); } } }
//Update function private void UpdateLogic() { var peersToRemove = new List <NetPeer>(); var stopwatch = new Stopwatch(); stopwatch.Start(); while (IsRunning) { #if DEBUG if (SimulateLatency) { var time = DateTime.UtcNow; lock (_pingSimulationList) { for (int i = 0; i < _pingSimulationList.Count; i++) { var incomingData = _pingSimulationList[i]; if (incomingData.TimeWhenGet <= time) { DataReceived(incomingData.Data, incomingData.Data.Length, incomingData.EndPoint); _pingSimulationList.RemoveAt(i); i--; } } } } #endif #if STATS_ENABLED ulong totalPacketLoss = 0; #endif int elapsed = (int)stopwatch.ElapsedMilliseconds; if (elapsed <= 0) { elapsed = 1; } //Process acks for (var netPeer = _peers.HeadPeer; netPeer != null; netPeer = netPeer.NextPeer) { if (netPeer.ConnectionState == ConnectionState.Disconnected && netPeer.TimeSinceLastPacket > DisconnectTimeout) { peersToRemove.Add(netPeer); } else { netPeer.Update(elapsed); #if STATS_ENABLED totalPacketLoss += netPeer.Statistics.PacketLoss; #endif } } _peers.RemovePeers(peersToRemove); peersToRemove.Clear(); #if STATS_ENABLED Statistics.PacketLoss = totalPacketLoss; #endif int sleepTime = UpdateTime - (int)(stopwatch.ElapsedMilliseconds - elapsed); stopwatch.Reset(); stopwatch.Start(); if (sleepTime > 0) { Thread.Sleep(sleepTime); } } stopwatch.Stop(); }