Optimized sending memory allocations

This commit is contained in:
Albin Corén 2018-01-10 09:20:17 +01:00
parent 13b0edca5d
commit eb4df1ab61

View File

@ -513,7 +513,13 @@ namespace MLAPI
//Client trying to send data to host //Client trying to send data to host
clientId = serverClientId; clientId = serverClientId;
} }
using (MemoryStream stream = new MemoryStream()) //2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -524,14 +530,19 @@ namespace MLAPI
writer.Write((ushort)data.Length); writer.Write((ushort)data.Length);
writer.Write(data); writer.Write(data);
} }
byte[] dataToSend = stream.ToArray(); NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], dataToSend, dataToSend.Length, out error);
} }
} }
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null) internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
{ {
using (MemoryStream stream = new MemoryStream()) //2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -542,7 +553,6 @@ namespace MLAPI
writer.Write((ushort)data.Length); writer.Write((ushort)data.Length);
writer.Write(data); writer.Write(data);
} }
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName]; int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Length; i++) for (int i = 0; i < clientIds.Length; i++)
{ {
@ -560,14 +570,20 @@ namespace MLAPI
//Client trying to send data to host //Client trying to send data to host
clientId = serverClientId; clientId = serverClientId;
} }
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error); NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
} }
} }
} }
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null) internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
{ {
using (MemoryStream stream = new MemoryStream()) //2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -578,7 +594,6 @@ namespace MLAPI
writer.Write((ushort)data.Length); writer.Write((ushort)data.Length);
writer.Write(data); writer.Write(data);
} }
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName]; int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Count; i++) for (int i = 0; i < clientIds.Count; i++)
{ {
@ -596,14 +611,20 @@ namespace MLAPI
//Client trying to send data to host //Client trying to send data to host
clientId = serverClientId; clientId = serverClientId;
} }
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error); NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
} }
} }
} }
internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null) internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null)
{ {
using (MemoryStream stream = new MemoryStream()) //2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -614,7 +635,6 @@ namespace MLAPI
writer.Write((ushort)data.Length); writer.Write((ushort)data.Length);
writer.Write(data); writer.Write(data);
} }
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName]; int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients) foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
{ {
@ -632,7 +652,7 @@ namespace MLAPI
//Client trying to send data to host //Client trying to send data to host
clientId = serverClientId; clientId = serverClientId;
} }
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error); NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
} }
} }
@ -640,7 +660,13 @@ namespace MLAPI
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null) internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null)
{ {
using (MemoryStream stream = new MemoryStream()) //2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -651,7 +677,6 @@ namespace MLAPI
writer.Write((ushort)data.Length); writer.Write((ushort)data.Length);
writer.Write(data); writer.Write(data);
} }
byte[] dataToSend = stream.ToArray();
int channel = MessageManager.channels[channelName]; int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients) foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
{ {
@ -671,7 +696,7 @@ namespace MLAPI
//Client trying to send data to host //Client trying to send data to host
clientId = serverClientId; clientId = serverClientId;
} }
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error); NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
} }
} }
} }