Skip to content

Commit b30de86

Browse files
committed
optimize receiving speed. removed one data copy
1 parent c91360e commit b30de86

File tree

4 files changed

+33
-51
lines changed

4 files changed

+33
-51
lines changed

LiteNetLib/NetManager.cs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ object IEnumerator.Current
147147
#if DEBUG
148148
private struct IncomingData
149149
{
150-
public byte[] Data;
150+
public NetPacket Data;
151151
public IPEndPoint EndPoint;
152152
public DateTime TimeWhenGet;
153153
}
@@ -720,7 +720,7 @@ private void ProcessDelayedPackets()
720720
var incomingData = _pingSimulationList[i];
721721
if (incomingData.TimeWhenGet <= time)
722722
{
723-
DataReceived(incomingData.Data, incomingData.Data.Length, incomingData.EndPoint);
723+
DataReceived(incomingData.Data, incomingData.EndPoint);
724724
_pingSimulationList.RemoveAt(i);
725725
i--;
726726
}
@@ -789,7 +789,7 @@ public void ManualReceive()
789789
ProcessDelayedPackets();
790790
}
791791

792-
internal void OnMessageReceived(byte[] data, int length, SocketError errorCode, IPEndPoint remoteEndPoint)
792+
internal void OnMessageReceived(NetPacket packet, SocketError errorCode, IPEndPoint remoteEndPoint)
793793
{
794794
if (errorCode != 0)
795795
{
@@ -808,14 +808,11 @@ internal void OnMessageReceived(byte[] data, int length, SocketError errorCode,
808808
int latency = _randomGenerator.Next(SimulationMinLatency, SimulationMaxLatency);
809809
if (latency > MinLatencyThreshold)
810810
{
811-
byte[] holdedData = new byte[length];
812-
Buffer.BlockCopy(data, 0, holdedData, 0, length);
813-
814811
lock (_pingSimulationList)
815812
{
816813
_pingSimulationList.Add(new IncomingData
817814
{
818-
Data = holdedData,
815+
Data = packet,
819816
EndPoint = remoteEndPoint,
820817
TimeWhenGet = DateTime.UtcNow.AddMilliseconds(latency)
821818
});
@@ -828,7 +825,7 @@ internal void OnMessageReceived(byte[] data, int length, SocketError errorCode,
828825
try
829826
{
830827
//ProcessEvents
831-
DataReceived(data, length, remoteEndPoint);
828+
DataReceived(packet, remoteEndPoint);
832829
}
833830
catch(Exception e)
834831
{
@@ -963,27 +960,27 @@ private void ProcessConnectRequest(
963960
CreateEvent(NetEvent.EType.ConnectionRequest, connectionRequest: req);
964961
}
965962

966-
private void DataReceived(byte[] reusableBuffer, int count, IPEndPoint remoteEndPoint)
963+
private void DataReceived(NetPacket packet, IPEndPoint remoteEndPoint)
967964
{
968965
if (EnableStatistics)
969966
{
970967
Statistics.IncrementPacketsReceived();
971-
Statistics.AddBytesReceived(count);
968+
Statistics.AddBytesReceived(packet.Size);
972969
}
973970

974971
if (_ntpRequests.Count > 0)
975972
{
976973
NtpRequest request;
977974
if (_ntpRequests.TryGetValue(remoteEndPoint, out request))
978975
{
979-
if (count < 48)
976+
if (packet.Size < 48)
980977
{
981-
NetDebug.Write(NetLogLevel.Trace, "NTP response too short: {}", count);
978+
NetDebug.Write(NetLogLevel.Trace, "NTP response too short: {}", packet.Size);
982979
return;
983980
}
984981

985-
byte[] copiedData = new byte[count];
986-
Buffer.BlockCopy(reusableBuffer, 0, copiedData, 0, count);
982+
byte[] copiedData = new byte[packet.Size];
983+
Buffer.BlockCopy(packet.RawData, 0, copiedData, 0, packet.Size);
987984
NtpPacket ntpPacket = NtpPacket.FromServerResponse(copiedData, DateTime.UtcNow);
988985
try
989986
{
@@ -1005,24 +1002,18 @@ private void DataReceived(byte[] reusableBuffer, int count, IPEndPoint remoteEnd
10051002
}
10061003
}
10071004

1008-
int start = 0;
10091005
if (_extraPacketLayer != null)
10101006
{
1011-
_extraPacketLayer.ProcessInboundPacket(remoteEndPoint, ref reusableBuffer, ref start, ref count);
1012-
if (count == 0)
1007+
int start = 0;
1008+
_extraPacketLayer.ProcessInboundPacket(remoteEndPoint, ref packet.RawData, ref start, ref packet.Size);
1009+
if (packet.Size == 0)
10131010
return;
10141011
}
10151012

1016-
//empty packet
1017-
if (reusableBuffer[start] == (byte) PacketProperty.Empty)
1018-
return;
1019-
1020-
//Try read packet
1021-
NetPacket packet = NetPacketPool.GetPacket(count);
1022-
if (!packet.FromBytes(reusableBuffer, start, count))
1013+
if (!packet.Verify())
10231014
{
1024-
NetPacketPool.Recycle(packet);
10251015
NetDebug.WriteError("[NM] DataReceived: bad!");
1016+
NetPacketPool.Recycle(packet);
10261017
return;
10271018
}
10281019

LiteNetLib/NetPacket.cs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -151,28 +151,14 @@ public int GetHeaderSize()
151151
return HeaderSizes[RawData[0] & 0x1F];
152152
}
153153

154-
//Packet constructor from byte array
155-
public bool FromBytes(byte[] data, int start, int packetSize)
154+
public bool Verify()
156155
{
157-
//Reading property
158-
byte property = (byte)(data[start] & 0x1F);
159-
bool fragmented = (data[start] & 0x80) != 0;
160-
156+
byte property = (byte)(RawData[0] & 0x1F);
161157
if (property > LastProperty)
162158
return false;
163-
164159
int headerSize = HeaderSizes[property];
165-
166-
if (packetSize < headerSize ||
167-
(fragmented && packetSize < headerSize + NetConstants.FragmentHeaderSize) ||
168-
data.Length < start + packetSize)
169-
{
170-
return false;
171-
}
172-
173-
Buffer.BlockCopy(data, start, RawData, 0, packetSize);
174-
Size = (ushort)packetSize;
175-
return true;
160+
bool fragmented = (RawData[0] & 0x80) != 0;
161+
return Size >= headerSize && (!fragmented || Size >= headerSize + NetConstants.FragmentHeaderSize);
176162
}
177163
}
178164

LiteNetLib/NetPeer.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,10 @@ internal void ProcessPacket(NetPacket packet)
920920
ushort size = BitConverter.ToUInt16(packet.RawData, pos);
921921
pos += 2;
922922
NetPacket mergedPacket = _packetPool.GetPacket(size);
923-
if (!mergedPacket.FromBytes(packet.RawData, pos, size))
923+
Buffer.BlockCopy(packet.RawData, pos, mergedPacket.RawData, 0, size);
924+
mergedPacket.Size = size;
925+
926+
if (!mergedPacket.Verify() || packet.RawData.Length < pos + size)
924927
{
925928
_packetPool.Recycle(packet);
926929
break;

LiteNetLib/NetSocket.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private bool ProcessError(SocketException ex, EndPoint bufferEndPoint)
158158
default:
159159
NetDebug.WriteError("[R]Error code: {0} - {1}", (int)ex.SocketErrorCode,
160160
ex.ToString());
161-
_listener.OnMessageReceived(null, 0, ex.SocketErrorCode, (IPEndPoint)bufferEndPoint);
161+
_listener.OnMessageReceived(null, ex.SocketErrorCode, (IPEndPoint)bufferEndPoint);
162162
break;
163163
}
164164
return false;
@@ -182,11 +182,12 @@ private bool ManualReceive(Socket socket, EndPoint bufferEndPoint, byte[] receiv
182182
return false;
183183
while (available > 0)
184184
{
185-
result = socket.ReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None,
185+
var packet = _listener.NetPacketPool.GetPacket(NetConstants.MaxPacketSize);
186+
packet.Size = socket.ReceiveFrom(packet.RawData, 0, NetConstants.MaxPacketSize, SocketFlags.None,
186187
ref bufferEndPoint);
187188
NetDebug.Write(NetLogLevel.Trace, "[R]Received data from {0}, result: {1}", bufferEndPoint.ToString(), result);
188-
_listener.OnMessageReceived(receiveBuffer, result, 0, (IPEndPoint)bufferEndPoint);
189-
available -= result;
189+
_listener.OnMessageReceived(packet, 0, (IPEndPoint)bufferEndPoint);
190+
available -= packet.Size;
190191
}
191192
}
192193
catch (SocketException ex)
@@ -204,18 +205,19 @@ private void ReceiveLogic(object state)
204205
{
205206
Socket socket = (Socket)state;
206207
EndPoint bufferEndPoint = new IPEndPoint(socket.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, 0);
207-
byte[] receiveBuffer = new byte[NetConstants.MaxPacketSize];
208208

209209
while (IsActive())
210210
{
211211
int result;
212+
NetPacket packet;
212213

213214
//Reading data
214215
try
215216
{
216217
if (socket.Available == 0 && !socket.Poll(ReceivePollingTime, SelectMode.SelectRead))
217218
continue;
218-
result = socket.ReceiveFrom(receiveBuffer, 0, receiveBuffer.Length, SocketFlags.None,
219+
packet = _listener.NetPacketPool.GetPacket(NetConstants.MaxPacketSize);
220+
packet.Size = socket.ReceiveFrom(packet.RawData, 0, NetConstants.MaxPacketSize, SocketFlags.None,
219221
ref bufferEndPoint);
220222
}
221223
catch (SocketException ex)
@@ -231,7 +233,7 @@ private void ReceiveLogic(object state)
231233

232234
//All ok!
233235
NetDebug.Write(NetLogLevel.Trace, "[R]Received data from {0}, result: {1}", bufferEndPoint.ToString(), result);
234-
_listener.OnMessageReceived(receiveBuffer, result, 0, (IPEndPoint)bufferEndPoint);
236+
_listener.OnMessageReceived(packet, 0, (IPEndPoint)bufferEndPoint);
235237
}
236238
}
237239

0 commit comments

Comments
 (0)