Skip to content

Commit 74b9af8

Browse files
committed
Added pooled BitWriter & BitReader
1 parent 5af6ea5 commit 74b9af8

20 files changed

+1533
-1242
lines changed

MLAPI/Data/AttributeMessageMode.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ public ReflectionMehtod(MethodInfo methodInfo)
4141

4242
public void Invoke(object instance, Stream stream)
4343
{
44-
BitReader reader = new BitReader(stream);
45-
for (int i = 0; i < parameterTypes.Length; i++)
44+
using (PooledBitReader reader = PooledBitReader.Get(stream))
4645
{
47-
parameterRefs[i] = reader.ReadObjectPacked(parameterTypes[i]);
46+
for (int i = 0; i < parameterTypes.Length; i++)
47+
{
48+
parameterRefs[i] = reader.ReadObjectPacked(parameterTypes[i]);
49+
}
50+
51+
method.Invoke(instance, parameterRefs);
4852
}
49-
50-
method.Invoke(instance, parameterRefs);
5153
}
5254
}
5355

MLAPI/Data/NetworkConfig.cs

Lines changed: 128 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -162,49 +162,51 @@ public string ToBase64()
162162
NetworkConfig config = this;
163163
using (PooledBitStream stream = PooledBitStream.Get())
164164
{
165-
BitWriter writer = new BitWriter(stream);
166-
writer.WriteUInt16Packed(config.ProtocolVersion);
167-
writer.WriteBits((byte)config.Transport, 5);
168-
169-
writer.WriteUInt16Packed((ushort)config.Channels.Count);
170-
for (int i = 0; i < config.Channels.Count; i++)
165+
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
171166
{
172-
writer.WriteString(config.Channels[i].Name);
173-
writer.WriteBits((byte)config.Channels[i].Type, 5);
174-
}
167+
writer.WriteUInt16Packed(config.ProtocolVersion);
168+
writer.WriteBits((byte)config.Transport, 5);
175169

176-
writer.WriteUInt16Packed((ushort)config.RegisteredScenes.Count);
177-
for (int i = 0; i < config.RegisteredScenes.Count; i++)
178-
{
179-
writer.WriteString(config.RegisteredScenes[i]);
180-
}
170+
writer.WriteUInt16Packed((ushort)config.Channels.Count);
171+
for (int i = 0; i < config.Channels.Count; i++)
172+
{
173+
writer.WriteString(config.Channels[i].Name);
174+
writer.WriteBits((byte)config.Channels[i].Type, 5);
175+
}
181176

182-
writer.WriteUInt16Packed((ushort)config.NetworkedPrefabs.Count);
183-
for (int i = 0; i < config.NetworkedPrefabs.Count; i++)
184-
{
185-
writer.WriteBool(config.NetworkedPrefabs[i].playerPrefab);
186-
writer.WriteString(config.NetworkedPrefabs[i].name);
187-
}
177+
writer.WriteUInt16Packed((ushort)config.RegisteredScenes.Count);
178+
for (int i = 0; i < config.RegisteredScenes.Count; i++)
179+
{
180+
writer.WriteString(config.RegisteredScenes[i]);
181+
}
188182

189-
writer.WriteInt32Packed(config.MessageBufferSize);
190-
writer.WriteInt32Packed(config.ReceiveTickrate);
191-
writer.WriteInt32Packed(config.MaxReceiveEventsPerTickRate);
192-
writer.WriteInt32Packed(config.SendTickrate);
193-
writer.WriteInt32Packed(config.EventTickrate);
194-
writer.WriteInt32Packed(config.MaxConnections);
195-
writer.WriteInt32Packed(config.ConnectPort);
196-
writer.WriteString(config.ConnectAddress);
197-
writer.WriteInt32Packed(config.ClientConnectionBufferTimeout);
198-
writer.WriteBool(config.ConnectionApproval);
199-
writer.WriteInt32Packed(config.SecondsHistory);
200-
writer.WriteBool(config.HandleObjectSpawning);
201-
writer.WriteBool(config.EnableEncryption);
202-
writer.WriteBool(config.SignKeyExchange);
203-
writer.WriteBool(config.EnableSceneSwitching);
204-
writer.WriteBool(config.EnableTimeResync);
205-
writer.WriteBits((byte)config.AttributeMessageMode, 3);
183+
writer.WriteUInt16Packed((ushort)config.NetworkedPrefabs.Count);
184+
for (int i = 0; i < config.NetworkedPrefabs.Count; i++)
185+
{
186+
writer.WriteBool(config.NetworkedPrefabs[i].playerPrefab);
187+
writer.WriteString(config.NetworkedPrefabs[i].name);
188+
}
189+
190+
writer.WriteInt32Packed(config.MessageBufferSize);
191+
writer.WriteInt32Packed(config.ReceiveTickrate);
192+
writer.WriteInt32Packed(config.MaxReceiveEventsPerTickRate);
193+
writer.WriteInt32Packed(config.SendTickrate);
194+
writer.WriteInt32Packed(config.EventTickrate);
195+
writer.WriteInt32Packed(config.MaxConnections);
196+
writer.WriteInt32Packed(config.ConnectPort);
197+
writer.WriteString(config.ConnectAddress);
198+
writer.WriteInt32Packed(config.ClientConnectionBufferTimeout);
199+
writer.WriteBool(config.ConnectionApproval);
200+
writer.WriteInt32Packed(config.SecondsHistory);
201+
writer.WriteBool(config.HandleObjectSpawning);
202+
writer.WriteBool(config.EnableEncryption);
203+
writer.WriteBool(config.SignKeyExchange);
204+
writer.WriteBool(config.EnableSceneSwitching);
205+
writer.WriteBool(config.EnableTimeResync);
206+
writer.WriteBits((byte)config.AttributeMessageMode, 3);
206207

207-
return Convert.ToBase64String(stream.ToArray());
208+
return Convert.ToBase64String(stream.ToArray());
209+
}
208210
}
209211
}
210212

@@ -219,68 +221,70 @@ public void FromBase64(string base64, bool createDummyObject = false)
219221
byte[] binary = Convert.FromBase64String(base64);
220222
using (BitStream stream = new BitStream(binary))
221223
{
222-
BitReader reader = new BitReader(stream);
223-
224-
config.ProtocolVersion = reader.ReadUInt16Packed();
225-
config.Transport = (DefaultTransport)reader.ReadBits(5);
226-
227-
ushort channelCount = reader.ReadUInt16Packed();
228-
config.Channels.Clear();
229-
for (int i = 0; i < channelCount; i++)
224+
using (PooledBitReader reader = PooledBitReader.Get(stream))
230225
{
231-
Channel channel = new Channel()
232-
{
233-
Name = reader.ReadString().ToString(),
234-
Type = (ChannelType)reader.ReadBits(5)
235-
};
236-
config.Channels.Add(channel);
237-
}
238226

239-
ushort sceneCount = reader.ReadUInt16Packed();
240-
config.RegisteredScenes.Clear();
241-
for (int i = 0; i < sceneCount; i++)
242-
{
243-
config.RegisteredScenes.Add(reader.ReadString().ToString());
244-
}
227+
config.ProtocolVersion = reader.ReadUInt16Packed();
228+
config.Transport = (DefaultTransport)reader.ReadBits(5);
245229

246-
ushort networkedPrefabsCount = reader.ReadUInt16Packed();
247-
config.NetworkedPrefabs.Clear();
248-
GameObject root = createDummyObject ? new GameObject("MLAPI: Dummy prefabs") : null;
249-
for (int i = 0; i < networkedPrefabsCount; i++)
250-
{
251-
bool playerPrefab = reader.ReadBool();
252-
string prefabName = reader.ReadString().ToString();
253-
GameObject dummyPrefab = createDummyObject ? new GameObject("REPLACEME: " + prefabName + "(Dummy prefab)", typeof(NetworkedObject)) : null;
254-
if (dummyPrefab != null)
230+
ushort channelCount = reader.ReadUInt16Packed();
231+
config.Channels.Clear();
232+
for (int i = 0; i < channelCount; i++)
255233
{
256-
dummyPrefab.GetComponent<NetworkedObject>().NetworkedPrefabName = prefabName;
257-
dummyPrefab.transform.SetParent(root.transform); //This is just here to not ruin your hierarchy
234+
Channel channel = new Channel()
235+
{
236+
Name = reader.ReadString().ToString(),
237+
Type = (ChannelType)reader.ReadBits(5)
238+
};
239+
config.Channels.Add(channel);
258240
}
259-
NetworkedPrefab networkedPrefab = new NetworkedPrefab()
241+
242+
ushort sceneCount = reader.ReadUInt16Packed();
243+
config.RegisteredScenes.Clear();
244+
for (int i = 0; i < sceneCount; i++)
260245
{
261-
playerPrefab = playerPrefab,
262-
prefab = dummyPrefab
263-
};
264-
config.NetworkedPrefabs.Add(networkedPrefab);
265-
}
246+
config.RegisteredScenes.Add(reader.ReadString().ToString());
247+
}
248+
249+
ushort networkedPrefabsCount = reader.ReadUInt16Packed();
250+
config.NetworkedPrefabs.Clear();
251+
GameObject root = createDummyObject ? new GameObject("MLAPI: Dummy prefabs") : null;
252+
for (int i = 0; i < networkedPrefabsCount; i++)
253+
{
254+
bool playerPrefab = reader.ReadBool();
255+
string prefabName = reader.ReadString().ToString();
256+
GameObject dummyPrefab = createDummyObject ? new GameObject("REPLACEME: " + prefabName + "(Dummy prefab)", typeof(NetworkedObject)) : null;
257+
if (dummyPrefab != null)
258+
{
259+
dummyPrefab.GetComponent<NetworkedObject>().NetworkedPrefabName = prefabName;
260+
dummyPrefab.transform.SetParent(root.transform); //This is just here to not ruin your hierarchy
261+
}
262+
NetworkedPrefab networkedPrefab = new NetworkedPrefab()
263+
{
264+
playerPrefab = playerPrefab,
265+
prefab = dummyPrefab
266+
};
267+
config.NetworkedPrefabs.Add(networkedPrefab);
268+
}
266269

267-
config.MessageBufferSize = reader.ReadInt32Packed();
268-
config.ReceiveTickrate = reader.ReadInt32Packed();
269-
config.MaxReceiveEventsPerTickRate = reader.ReadInt32Packed();
270-
config.SendTickrate = reader.ReadInt32Packed();
271-
config.EventTickrate = reader.ReadInt32Packed();
272-
config.MaxConnections = reader.ReadInt32Packed();
273-
config.ConnectPort = reader.ReadInt32Packed();
274-
config.ConnectAddress = reader.ReadString().ToString();
275-
config.ClientConnectionBufferTimeout = reader.ReadInt32Packed();
276-
config.ConnectionApproval = reader.ReadBool();
277-
config.SecondsHistory = reader.ReadInt32Packed();
278-
config.HandleObjectSpawning = reader.ReadBool();
279-
config.EnableEncryption = reader.ReadBool();
280-
config.SignKeyExchange = reader.ReadBool();
281-
config.EnableSceneSwitching = reader.ReadBool();
282-
config.EnableTimeResync = reader.ReadBool();
283-
config.AttributeMessageMode = (AttributeMessageMode)reader.ReadBits(3);
270+
config.MessageBufferSize = reader.ReadInt32Packed();
271+
config.ReceiveTickrate = reader.ReadInt32Packed();
272+
config.MaxReceiveEventsPerTickRate = reader.ReadInt32Packed();
273+
config.SendTickrate = reader.ReadInt32Packed();
274+
config.EventTickrate = reader.ReadInt32Packed();
275+
config.MaxConnections = reader.ReadInt32Packed();
276+
config.ConnectPort = reader.ReadInt32Packed();
277+
config.ConnectAddress = reader.ReadString().ToString();
278+
config.ClientConnectionBufferTimeout = reader.ReadInt32Packed();
279+
config.ConnectionApproval = reader.ReadBool();
280+
config.SecondsHistory = reader.ReadInt32Packed();
281+
config.HandleObjectSpawning = reader.ReadBool();
282+
config.EnableEncryption = reader.ReadBool();
283+
config.SignKeyExchange = reader.ReadBool();
284+
config.EnableSceneSwitching = reader.ReadBool();
285+
config.EnableTimeResync = reader.ReadBool();
286+
config.AttributeMessageMode = (AttributeMessageMode)reader.ReadBits(3);
287+
}
284288
}
285289
}
286290

@@ -300,42 +304,44 @@ public ulong GetConfig(bool cache = true)
300304

301305
using (PooledBitStream stream = PooledBitStream.Get())
302306
{
303-
BitWriter writer = new BitWriter(stream);
304-
writer.WriteUInt16Packed(ProtocolVersion);
305-
writer.WriteString(MLAPIConstants.MLAPI_PROTOCOL_VERSION);
306-
307-
for (int i = 0; i < Channels.Count; i++)
308-
{
309-
writer.WriteString(Channels[i].Name);
310-
writer.WriteByte((byte)Channels[i].Type);
311-
}
312-
if (EnableSceneSwitching)
307+
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
313308
{
314-
for (int i = 0; i < RegisteredScenes.Count; i++)
309+
writer.WriteUInt16Packed(ProtocolVersion);
310+
writer.WriteString(MLAPIConstants.MLAPI_PROTOCOL_VERSION);
311+
312+
for (int i = 0; i < Channels.Count; i++)
315313
{
316-
writer.WriteString(RegisteredScenes[i]);
314+
writer.WriteString(Channels[i].Name);
315+
writer.WriteByte((byte)Channels[i].Type);
317316
}
318-
}
319-
if (HandleObjectSpawning)
320-
{
321-
for (int i = 0; i < NetworkedPrefabs.Count; i++)
317+
if (EnableSceneSwitching)
322318
{
323-
writer.WriteString(NetworkedPrefabs[i].name);
319+
for (int i = 0; i < RegisteredScenes.Count; i++)
320+
{
321+
writer.WriteString(RegisteredScenes[i]);
322+
}
324323
}
325-
}
326-
writer.WriteBool(HandleObjectSpawning);
327-
writer.WriteBool(EnableEncryption);
328-
writer.WriteBool(EnableSceneSwitching);
329-
writer.WriteBool(SignKeyExchange);
330-
writer.WriteBits((byte)AttributeMessageMode, 3);
324+
if (HandleObjectSpawning)
325+
{
326+
for (int i = 0; i < NetworkedPrefabs.Count; i++)
327+
{
328+
writer.WriteString(NetworkedPrefabs[i].name);
329+
}
330+
}
331+
writer.WriteBool(HandleObjectSpawning);
332+
writer.WriteBool(EnableEncryption);
333+
writer.WriteBool(EnableSceneSwitching);
334+
writer.WriteBool(SignKeyExchange);
335+
writer.WriteBits((byte)AttributeMessageMode, 3);
331336

332-
// Returns a 160 bit / 20 byte / 5 int checksum of the config
333-
if (cache)
334-
{
335-
ConfigHash = stream.ToArray().GetStableHash64();
336-
return ConfigHash.Value;
337+
// Returns a 160 bit / 20 byte / 5 int checksum of the config
338+
if (cache)
339+
{
340+
ConfigHash = stream.ToArray().GetStableHash64();
341+
return ConfigHash.Value;
342+
}
343+
return stream.ToArray().GetStableHash64();
337344
}
338-
return stream.ToArray().GetStableHash64();
339345
}
340346
}
341347

0 commit comments

Comments
 (0)