1
0
mirror of https://github.com/lidgren/lidgren-network-gen3.git synced 2026-05-17 07:36:32 +09:00

Avoid array duplication of an array that is not accesible.

Avoid extra array allocations with reads that require a byte array. (corrected with the comment of @Inverness)
This commit is contained in:
Andrés Leone
2016-06-25 20:47:29 +02:00
parent a7468f4f1c
commit d14d3e0d2d
2 changed files with 20 additions and 7 deletions

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using System.Reflection; using System.Reflection;
using System.Net; using System.Net;
using System.Threading;
#if !__NOIPENDPOINT__ #if !__NOIPENDPOINT__
using NetEndPoint = System.Net.IPEndPoint; using NetEndPoint = System.Net.IPEndPoint;
@@ -17,6 +18,8 @@ namespace Lidgren.Network
{ {
private const string c_readOverflowError = "Trying to read past the buffer size - likely caused by mismatching Write/Reads, different size or order."; private const string c_readOverflowError = "Trying to read past the buffer size - likely caused by mismatching Write/Reads, different size or order.";
private static byte[] s_buffer;
/// <summary> /// <summary>
/// Reads a boolean value (stored as a single bit) written using Write(bool) /// Reads a boolean value (stored as a single bit) written using Write(bool)
/// </summary> /// </summary>
@@ -352,8 +355,11 @@ namespace Lidgren.Network
return retval; return retval;
} }
byte[] bytes = ReadBytes(4); byte[] bytes = Interlocked.Exchange(ref s_buffer, null) ?? new byte[8];
return BitConverter.ToSingle(bytes, 0); ReadBytes(bytes, 0, 4);
float res = BitConverter.ToSingle(bytes, 0);
s_buffer = bytes;
return res;
} }
/// <summary> /// <summary>
@@ -374,8 +380,10 @@ namespace Lidgren.Network
return true; return true;
} }
byte[] bytes = ReadBytes(4); byte[] bytes = Interlocked.Exchange(ref s_buffer, null) ?? new byte[8];
ReadBytes(bytes, 0, 4);
result = BitConverter.ToSingle(bytes, 0); result = BitConverter.ToSingle(bytes, 0);
s_buffer = bytes;
return true; return true;
} }
@@ -394,8 +402,11 @@ namespace Lidgren.Network
return retval; return retval;
} }
byte[] bytes = ReadBytes(8); byte[] bytes = Interlocked.Exchange(ref s_buffer, null) ?? new byte[8];
return BitConverter.ToDouble(bytes, 0); ReadBytes(bytes, 0, 8);
double res = BitConverter.ToDouble(bytes, 0);
s_buffer = bytes;
return res;
} }
// //

View File

@@ -24,7 +24,8 @@ namespace Lidgren.Network
/// <param name="method">How to deliver the message</param> /// <param name="method">How to deliver the message</param>
public void SendToAll(NetOutgoingMessage msg, NetDeliveryMethod method) public void SendToAll(NetOutgoingMessage msg, NetDeliveryMethod method)
{ {
var all = this.Connections; // Modifying m_connections will modify the list of the connections of the NetPeer. Do only reads here
var all = m_connections;
if (all.Count <= 0) { if (all.Count <= 0) {
if (msg.m_isSent == false) if (msg.m_isSent == false)
Recycle(msg); Recycle(msg);
@@ -43,7 +44,8 @@ namespace Lidgren.Network
/// <param name="sequenceChannel">Which sequence channel to use for the message</param> /// <param name="sequenceChannel">Which sequence channel to use for the message</param>
public void SendToAll(NetOutgoingMessage msg, NetConnection except, NetDeliveryMethod method, int sequenceChannel) public void SendToAll(NetOutgoingMessage msg, NetConnection except, NetDeliveryMethod method, int sequenceChannel)
{ {
var all = this.Connections; // Modifying m_connections will modify the list of the connections of the NetPeer. Do only reads here
var all = m_connections;
if (all.Count <= 0) { if (all.Count <= 0) {
if (msg.m_isSent == false) if (msg.m_isSent == false)
Recycle(msg); Recycle(msg);