diff --git a/LiteNetLib/NetManager.cs b/LiteNetLib/NetManager.cs index 00dcd50b..752dfb7c 100644 --- a/LiteNetLib/NetManager.cs +++ b/LiteNetLib/NetManager.cs @@ -149,8 +149,8 @@ private struct IncomingData private bool _manualMode; private readonly AutoResetEvent _updateTriggerEvent = new AutoResetEvent(true); - private Queue _netEventsProduceQueue = new Queue(); - private Queue _netEventsConsumeQueue = new Queue(); + private NetEvent _pendingEventHead; + private NetEvent _pendingEventTail; private NetEvent _netEventPoolHead; private readonly INetEventListener _netEventListener; @@ -530,6 +530,7 @@ private void CreateEvent( _netEventPoolHead = evt.Next; } + evt.Next = null; evt.Type = type; evt.DataReader.SetSource(readerSource, readerSource?.GetHeaderSize() ?? 0); evt.Peer = peer; @@ -548,8 +549,14 @@ private void CreateEvent( } else { - lock(_netEventsProduceQueue) - _netEventsProduceQueue.Enqueue(evt); + lock (_eventLock) + { + if (_pendingEventTail == null) + _pendingEventHead = evt; + else + _pendingEventTail.Next = evt; + _pendingEventTail = evt; + } } } @@ -1111,27 +1118,48 @@ private void DebugMessageReceived(NetPacket packet, IPEndPoint remoteEndPoint) internal void CreateReceiveEvent(NetPacket packet, DeliveryMethod method, byte channelNumber, int headerSize, NetPeer fromPeer) { NetEvent evt; - lock (_eventLock) - { - evt = _netEventPoolHead; - if (evt == null) - evt = new NetEvent(this); - else - _netEventPoolHead = evt.Next; - } - evt.Type = NetEvent.EType.Receive; - evt.DataReader.SetSource(packet, headerSize); - evt.Peer = fromPeer; - evt.DeliveryMethod = method; - evt.ChannelNumber = channelNumber; + if (UnsyncedEvents || UnsyncedReceiveEvent || _manualMode) { + lock (_eventLock) + { + evt = _netEventPoolHead; + if (evt == null) + evt = new NetEvent(this); + else + _netEventPoolHead = evt.Next; + } + evt.Next = null; + evt.Type = NetEvent.EType.Receive; + evt.DataReader.SetSource(packet, headerSize); + evt.Peer = fromPeer; + evt.DeliveryMethod = method; + evt.ChannelNumber = channelNumber; ProcessEvent(evt); } else { - lock(_netEventsProduceQueue) - _netEventsProduceQueue.Enqueue(evt); + lock (_eventLock) + { + evt = _netEventPoolHead; + if (evt == null) + evt = new NetEvent(this); + else + _netEventPoolHead = evt.Next; + + evt.Next = null; + evt.Type = NetEvent.EType.Receive; + evt.DataReader.SetSource(packet, headerSize); + evt.Peer = fromPeer; + evt.DeliveryMethod = method; + evt.ChannelNumber = channelNumber; + + if (_pendingEventTail == null) + _pendingEventHead = evt; + else + _pendingEventTail.Next = evt; + _pendingEventTail = evt; + } } } @@ -1458,13 +1486,20 @@ public void PollEvents() } if (UnsyncedEvents) return; - lock (_netEventsProduceQueue) + NetEvent pendingEvent; + lock (_eventLock) { - (_netEventsConsumeQueue, _netEventsProduceQueue) = (_netEventsProduceQueue, _netEventsConsumeQueue); + pendingEvent = _pendingEventHead; + _pendingEventHead = null; + _pendingEventTail = null; } - while(_netEventsConsumeQueue.Count > 0) - ProcessEvent(_netEventsConsumeQueue.Dequeue()); + while (pendingEvent != null) + { + var next = pendingEvent.Next; + ProcessEvent(pendingEvent); + pendingEvent = next; + } } /// @@ -1608,8 +1643,8 @@ public void Stop(bool sendDisconnectMessages) _pingSimulationList.Clear(); #endif _connectedPeersCount = 0; - _netEventsProduceQueue.Clear(); - _netEventsConsumeQueue.Clear(); + _pendingEventHead = null; + _pendingEventTail = null; } /// diff --git a/LiteNetLib/NetPacket.cs b/LiteNetLib/NetPacket.cs index 7e29fe96..4b403084 100644 --- a/LiteNetLib/NetPacket.cs +++ b/LiteNetLib/NetPacket.cs @@ -1,5 +1,4 @@ using System; -using System.Net; using LiteNetLib.Utils; namespace LiteNetLib