Skip to content

Commit eb4df1a

Browse files
committed
Optimized sending memory allocations
1 parent 13b0edc commit eb4df1a

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,13 @@ internal void Send(int clientId, string messageType, string channelName, byte[]
513513
//Client trying to send data to host
514514
clientId = serverClientId;
515515
}
516-
using (MemoryStream stream = new MemoryStream())
516+
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
517+
int sizeOfStream = 5;
518+
if (networkId != null)
519+
sizeOfStream += 4;
520+
sizeOfStream += data.Length;
521+
522+
using (MemoryStream stream = new MemoryStream(sizeOfStream))
517523
{
518524
using (BinaryWriter writer = new BinaryWriter(stream))
519525
{
@@ -524,14 +530,19 @@ internal void Send(int clientId, string messageType, string channelName, byte[]
524530
writer.Write((ushort)data.Length);
525531
writer.Write(data);
526532
}
527-
byte[] dataToSend = stream.ToArray();
528-
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], dataToSend, dataToSend.Length, out error);
533+
NetworkTransport.Send(hostId, clientId, MessageManager.channels[channelName], stream.GetBuffer(), sizeOfStream, out error);
529534
}
530535
}
531536

532537
internal void Send(int[] clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
533538
{
534-
using (MemoryStream stream = new MemoryStream())
539+
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
540+
int sizeOfStream = 5;
541+
if (networkId != null)
542+
sizeOfStream += 4;
543+
sizeOfStream += data.Length;
544+
545+
using (MemoryStream stream = new MemoryStream(sizeOfStream))
535546
{
536547
using (BinaryWriter writer = new BinaryWriter(stream))
537548
{
@@ -542,7 +553,6 @@ internal void Send(int[] clientIds, string messageType, string channelName, byte
542553
writer.Write((ushort)data.Length);
543554
writer.Write(data);
544555
}
545-
byte[] dataToSend = stream.ToArray();
546556
int channel = MessageManager.channels[channelName];
547557
for (int i = 0; i < clientIds.Length; i++)
548558
{
@@ -560,14 +570,20 @@ internal void Send(int[] clientIds, string messageType, string channelName, byte
560570
//Client trying to send data to host
561571
clientId = serverClientId;
562572
}
563-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
573+
NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
564574
}
565575
}
566576
}
567577

568578
internal void Send(List<int> clientIds, string messageType, string channelName, byte[] data, uint? networkId = null)
569579
{
570-
using (MemoryStream stream = new MemoryStream())
580+
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
581+
int sizeOfStream = 5;
582+
if (networkId != null)
583+
sizeOfStream += 4;
584+
sizeOfStream += data.Length;
585+
586+
using (MemoryStream stream = new MemoryStream(sizeOfStream))
571587
{
572588
using (BinaryWriter writer = new BinaryWriter(stream))
573589
{
@@ -578,7 +594,6 @@ internal void Send(List<int> clientIds, string messageType, string channelName,
578594
writer.Write((ushort)data.Length);
579595
writer.Write(data);
580596
}
581-
byte[] dataToSend = stream.ToArray();
582597
int channel = MessageManager.channels[channelName];
583598
for (int i = 0; i < clientIds.Count; i++)
584599
{
@@ -596,14 +611,20 @@ internal void Send(List<int> clientIds, string messageType, string channelName,
596611
//Client trying to send data to host
597612
clientId = serverClientId;
598613
}
599-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
614+
NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
600615
}
601616
}
602617
}
603618

604619
internal void Send(string messageType, string channelName, byte[] data, uint? networkId = null)
605620
{
606-
using (MemoryStream stream = new MemoryStream())
621+
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
622+
int sizeOfStream = 5;
623+
if (networkId != null)
624+
sizeOfStream += 4;
625+
sizeOfStream += data.Length;
626+
627+
using (MemoryStream stream = new MemoryStream(sizeOfStream))
607628
{
608629
using (BinaryWriter writer = new BinaryWriter(stream))
609630
{
@@ -614,7 +635,6 @@ internal void Send(string messageType, string channelName, byte[] data, uint? ne
614635
writer.Write((ushort)data.Length);
615636
writer.Write(data);
616637
}
617-
byte[] dataToSend = stream.ToArray();
618638
int channel = MessageManager.channels[channelName];
619639
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
620640
{
@@ -632,15 +652,21 @@ internal void Send(string messageType, string channelName, byte[] data, uint? ne
632652
//Client trying to send data to host
633653
clientId = serverClientId;
634654
}
635-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
655+
NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
636656

637657
}
638658
}
639659
}
640660

641661
internal void Send(string messageType, string channelName, byte[] data, int clientIdToIgnore, uint? networkId = null)
642662
{
643-
using (MemoryStream stream = new MemoryStream())
663+
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
664+
int sizeOfStream = 5;
665+
if (networkId != null)
666+
sizeOfStream += 4;
667+
sizeOfStream += data.Length;
668+
669+
using (MemoryStream stream = new MemoryStream(sizeOfStream))
644670
{
645671
using (BinaryWriter writer = new BinaryWriter(stream))
646672
{
@@ -651,7 +677,6 @@ internal void Send(string messageType, string channelName, byte[] data, int clie
651677
writer.Write((ushort)data.Length);
652678
writer.Write(data);
653679
}
654-
byte[] dataToSend = stream.ToArray();
655680
int channel = MessageManager.channels[channelName];
656681
foreach (KeyValuePair<int, NetworkedClient> pair in connectedClients)
657682
{
@@ -671,7 +696,7 @@ internal void Send(string messageType, string channelName, byte[] data, int clie
671696
//Client trying to send data to host
672697
clientId = serverClientId;
673698
}
674-
NetworkTransport.Send(hostId, clientId, channel, dataToSend, dataToSend.Length, out error);
699+
NetworkTransport.Send(hostId, clientId, channel, stream.GetBuffer(), sizeOfStream, out error);
675700
}
676701
}
677702
}

0 commit comments

Comments
 (0)