Skip to content

Commit f7be6d5

Browse files
committed
work in progress, tons of optimizations
1 parent e7049fe commit f7be6d5

File tree

14 files changed

+336
-144
lines changed

14 files changed

+336
-144
lines changed

LibSample/BroadcastTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private class ClientListener : INetEventListener
1515

1616
public void OnPeerConnected(NetPeer peer)
1717
{
18-
Console.WriteLine("[Client {0}] connected to: {1}:{2}", Client.LocalPort, peer.EndPoint.Address, peer.EndPoint.Port);
18+
Console.WriteLine("[Client {0}] connected to: {1}:{2}", Client.LocalPort, peer.Address, peer.Port);
1919
}
2020

2121
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
@@ -60,17 +60,17 @@ private class ServerListener : INetEventListener
6060

6161
public void OnPeerConnected(NetPeer peer)
6262
{
63-
Console.WriteLine("[Server] Peer connected: " + peer.EndPoint);
63+
Console.WriteLine("[Server] Peer connected: " + peer);
6464
var peers = Server.ConnectedPeerList;
6565
foreach (var netPeer in peers)
6666
{
67-
Console.WriteLine("ConnectedPeersList: id={0}, ep={1}", netPeer.Id, netPeer.EndPoint);
67+
Console.WriteLine("ConnectedPeersList: id={0}, ep={1}", netPeer.Id, netPeer);
6868
}
6969
}
7070

7171
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
7272
{
73-
Console.WriteLine("[Server] Peer disconnected: " + peer.EndPoint + ", reason: " + disconnectInfo.Reason);
73+
Console.WriteLine("[Server] Peer disconnected: " + peer + ", reason: " + disconnectInfo.Reason);
7474
}
7575

7676
public void OnNetworkError(IPEndPoint endPoint, SocketError socketErrorCode)

LibSample/EchoMessagesTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private class ClientListener : INetEventListener
1515
{
1616
public void OnPeerConnected(NetPeer peer)
1717
{
18-
Console.WriteLine("[Client] connected to: {0}:{1}", peer.EndPoint.Address, peer.EndPoint.Port);
18+
Console.WriteLine("[Client] connected to: {0}:{1}", peer.Address, peer.Port);
1919

2020
NetDataWriter dataWriter = new NetDataWriter();
2121
for (int i = 0; i < 5; i++)
@@ -103,17 +103,17 @@ private class ServerListener : INetEventListener
103103

104104
public void OnPeerConnected(NetPeer peer)
105105
{
106-
Console.WriteLine("[Server] Peer connected: " + peer.EndPoint);
106+
Console.WriteLine("[Server] Peer connected: " + peer);
107107
foreach (var netPeer in Server)
108108
{
109109
if(netPeer.ConnectionState == ConnectionState.Connected)
110-
Console.WriteLine("ConnectedPeersList: id={0}, ep={1}", netPeer.Id, netPeer.EndPoint);
110+
Console.WriteLine("ConnectedPeersList: id={0}, ep={1}", netPeer.Id, netPeer);
111111
}
112112
}
113113

114114
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
115115
{
116-
Console.WriteLine("[Server] Peer disconnected: " + peer.EndPoint + ", reason: " + disconnectInfo.Reason);
116+
Console.WriteLine("[Server] Peer disconnected: " + peer + ", reason: " + disconnectInfo.Reason);
117117
}
118118

119119
public void OnNetworkError(IPEndPoint endPoint, SocketError socketErrorCode)

LibSample/GithubSample.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ public void Server()
2323

2424
listener.PeerConnectedEvent += peer =>
2525
{
26-
Console.WriteLine("We got connection: {0}", peer.EndPoint); // Show peer ip
27-
NetDataWriter writer = new NetDataWriter(); // Create writer class
28-
writer.Put("Hello client!"); // Put some string
29-
peer.Send(writer, DeliveryMethod.ReliableOrdered); // Send with reliability
26+
Console.WriteLine("We got connection: {0}", peer); // Show peer ip
27+
NetDataWriter writer = new NetDataWriter(); // Create writer class
28+
writer.Put("Hello client!"); // Put some string
29+
peer.Send(writer, DeliveryMethod.ReliableOrdered); // Send with reliability
3030
};
3131

3232
while (!Console.KeyAvailable)

LibSample/HolePunchServerTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void Run()
9191

9292
clientListener.PeerConnectedEvent += peer =>
9393
{
94-
Console.WriteLine("PeerConnected: " + peer.EndPoint);
94+
Console.WriteLine("PeerConnected: " + peer);
9595
};
9696

9797
clientListener.ConnectionRequestEvent += request =>

LibSample/SpeedBench.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, Ne
6969

7070
void INetEventListener.OnPeerConnected(NetPeer peer)
7171
{
72-
Console.WriteLine($"Server: client connected: {peer.EndPoint}");
72+
Console.WriteLine($"Server: client connected: {peer}");
7373
}
7474

7575
void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)

LiteNetLib.Tests/LiteNetLib.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">net6.0;net5.0;net471;netcoreapp3.1</TargetFrameworks>
77
<ApplicationIcon />
88
<StartupObject />
9-
<TargetFrameworks>net6.0;net5.0;net471;netcoreapp3.1;net8.0</TargetFrameworks>
9+
<TargetFrameworks>net6.0;net8.0;netcoreapp3.1;net471</TargetFrameworks>
1010
</PropertyGroup>
1111

1212
<ItemGroup>

LiteNetLib/NativeSocket.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ namespace LiteNetLib
1818

1919
private readonly int _hash;
2020

21-
public NativeAddr(byte[] address, int len)
21+
public NativeAddr(byte[] address)
2222
{
2323
_part1 = BitConverter.ToInt64(address, 0);
2424
_part2 = BitConverter.ToInt64(address, 8);
25-
if (len > 16)
25+
if (address.Length > 16)
2626
{
2727
_part3 = BitConverter.ToInt64(address, 16);
2828
_part4 = BitConverter.ToInt32(address, 24);
@@ -69,9 +69,9 @@ public override bool Equals(object obj)
6969

7070
internal class NativeEndPoint : IPEndPoint
7171
{
72-
public readonly byte[] NativeAddress;
72+
public byte[] NativeAddress;
7373

74-
public NativeEndPoint(byte[] address) : base(IPAddress.Any, 0)
74+
public void SetNetAddress(byte[] address)
7575
{
7676
NativeAddress = new byte[address.Length];
7777
Buffer.BlockCopy(address, 0, NativeAddress, 0, address.Length);
@@ -103,6 +103,11 @@ public NativeEndPoint(byte[] address) : base(IPAddress.Any, 0)
103103
Address = new IPAddress(ipv4Addr);
104104
}
105105
}
106+
107+
public NativeEndPoint() : base(IPAddress.Any, 0)
108+
{
109+
110+
}
106111
}
107112

108113
internal static class NativeSocket

LiteNetLib/NetManager.HashSet.cs

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
using System;
2+
using System.Net;
3+
4+
namespace LiteNetLib
5+
{
6+
//minimal hashset class from dotnet with some optimizations
7+
public partial class NetManager
8+
{
9+
private const int MaxPrimeArrayLength = 0x7FFFFFC3;
10+
private const int HashPrime = 101;
11+
private const int Lower31BitMask = 0x7FFFFFFF;
12+
private static readonly int[] Primes =
13+
{
14+
3, 7, 11, 17, 23, 29, 37, 47, 59, 71, 89, 107, 131, 163, 197, 239, 293, 353, 431, 521, 631, 761, 919,
15+
1103, 1327, 1597, 1931, 2333, 2801, 3371, 4049, 4861, 5839, 7013, 8419, 10103, 12143, 14591,
16+
17519, 21023, 25229, 30293, 36353, 43627, 52361, 62851, 75431, 90523, 108631, 130363, 156437,
17+
187751, 225307, 270371, 324449, 389357, 467237, 560689, 672827, 807403, 968897, 1162687, 1395263,
18+
1674319, 2009191, 2411033, 2893249, 3471899, 4166287, 4999559, 5999471, 7199369
19+
};
20+
21+
private static int HashSetGetPrime(int min)
22+
{
23+
foreach (int prime in Primes)
24+
{
25+
if (prime >= min)
26+
return prime;
27+
}
28+
29+
// Outside of our predefined table. Compute the hard way.
30+
for (int i = (min | 1); i < int.MaxValue; i += 2)
31+
{
32+
if (IsPrime(i) && ((i - 1) % HashPrime != 0))
33+
return i;
34+
}
35+
return min;
36+
37+
bool IsPrime(int candidate)
38+
{
39+
if ((candidate & 1) != 0)
40+
{
41+
int limit = (int)Math.Sqrt(candidate);
42+
for (int divisor = 3; divisor <= limit; divisor += 2)
43+
{
44+
if (candidate % divisor == 0)
45+
return false;
46+
}
47+
return true;
48+
}
49+
return candidate == 2;
50+
}
51+
}
52+
53+
private struct Slot
54+
{
55+
internal int HashCode;
56+
internal int Next;
57+
internal NetPeer Value;
58+
}
59+
60+
private int[] _buckets;
61+
private Slot[] _slots;
62+
private int _count;
63+
private int _lastIndex;
64+
private int _freeList;
65+
66+
private void ClearPeerSet()
67+
{
68+
if (_lastIndex > 0)
69+
{
70+
Array.Clear(_slots, 0, _lastIndex);
71+
Array.Clear(_buckets, 0, _buckets.Length);
72+
_lastIndex = 0;
73+
_count = 0;
74+
_freeList = -1;
75+
}
76+
}
77+
78+
private bool ContainsPeer(IPEndPoint item)
79+
{
80+
if (_buckets != null)
81+
{
82+
int hashCode = item.GetHashCode() & Lower31BitMask;
83+
for (int i = _buckets[hashCode % _buckets.Length] - 1; i >= 0; i = _slots[i].Next)
84+
{
85+
if (_slots[i].HashCode == hashCode && _slots[i].Value.Equals(item))
86+
return true;
87+
}
88+
}
89+
return false;
90+
}
91+
92+
private bool RemovePeerFromSet(IPEndPoint item)
93+
{
94+
if (_buckets == null)
95+
return false;
96+
int hashCode = item.GetHashCode() & Lower31BitMask;
97+
int bucket = hashCode % _buckets.Length;
98+
int last = -1;
99+
for (int i = _buckets[bucket] - 1; i >= 0; last = i, i = _slots[i].Next)
100+
{
101+
if (_slots[i].HashCode == hashCode && _slots[i].Value.Equals(item))
102+
{
103+
if (last < 0)
104+
_buckets[bucket] = _slots[i].Next + 1;
105+
else
106+
_slots[last].Next = _slots[i].Next;
107+
_slots[i].HashCode = -1;
108+
_slots[i].Value = null;
109+
_slots[i].Next = _freeList;
110+
111+
_count--;
112+
if (_count == 0)
113+
{
114+
_lastIndex = 0;
115+
_freeList = -1;
116+
}
117+
else
118+
{
119+
_freeList = i;
120+
}
121+
return true;
122+
}
123+
}
124+
return false;
125+
}
126+
127+
public bool TryGetPeer(IPEndPoint equalValue, out NetPeer actualValue)
128+
{
129+
if (_buckets != null)
130+
{
131+
int hashCode = equalValue.GetHashCode() & Lower31BitMask;
132+
for (int i = _buckets[hashCode % _buckets.Length] - 1; i >= 0; i = _slots[i].Next)
133+
{
134+
if (_slots[i].HashCode == hashCode && _slots[i].Value.Equals(equalValue))
135+
{
136+
actualValue = _slots[i].Value;
137+
return true;
138+
}
139+
}
140+
}
141+
actualValue = null;
142+
return false;
143+
}
144+
145+
private bool AddPeerToSet(NetPeer value)
146+
{
147+
if (_buckets == null)
148+
{
149+
int size = HashSetGetPrime(0);
150+
_buckets = new int[size];
151+
_slots = new Slot[size];
152+
}
153+
154+
int hashCode = value.GetHashCode() & Lower31BitMask;
155+
int bucket = hashCode % _buckets.Length;
156+
for (int i = _buckets[hashCode % _buckets.Length] - 1; i >= 0; i = _slots[i].Next)
157+
{
158+
if (_slots[i].HashCode == hashCode && _slots[i].Value.Equals(value))
159+
return false;
160+
}
161+
162+
int index;
163+
if (_freeList >= 0)
164+
{
165+
index = _freeList;
166+
_freeList = _slots[index].Next;
167+
}
168+
else
169+
{
170+
if (_lastIndex == _slots.Length)
171+
{
172+
//increase capacity
173+
int newSize = 2 * _count;
174+
newSize = (uint)newSize > MaxPrimeArrayLength && MaxPrimeArrayLength > _count
175+
? MaxPrimeArrayLength
176+
: HashSetGetPrime(newSize);
177+
178+
// Able to increase capacity; copy elements to larger array and rehash
179+
Slot[] newSlots = new Slot[newSize];
180+
Array.Copy(_slots, 0, newSlots, 0, _lastIndex);
181+
_buckets = new int[newSize];
182+
for (int i = 0; i < _lastIndex; i++)
183+
{
184+
int b = newSlots[i].HashCode % newSize;
185+
newSlots[i].Next = _buckets[b] - 1;
186+
_buckets[b] = i + 1;
187+
}
188+
_slots = newSlots;
189+
// this will change during resize
190+
bucket = hashCode % _buckets.Length;
191+
}
192+
index = _lastIndex;
193+
_lastIndex++;
194+
}
195+
_slots[index].HashCode = hashCode;
196+
_slots[index].Value = value;
197+
_slots[index].Next = _buckets[bucket] - 1;
198+
_buckets[bucket] = index + 1;
199+
_count++;
200+
201+
return true;
202+
}
203+
}
204+
205+
}

0 commit comments

Comments
 (0)