Server DispatchOrdersToClients create frame once for all clients.
Avoid creating frame data per client connection. Avoid the allocation of a memory stream and setting frame header and copying frame data.
This commit is contained in:
@@ -660,16 +660,26 @@ namespace OpenRA.Server
|
||||
}
|
||||
}
|
||||
|
||||
byte[] CreateFrame(int client, int frame, byte[] data)
|
||||
{
|
||||
var ms = new MemoryStream(data.Length + 12);
|
||||
ms.WriteArray(BitConverter.GetBytes(data.Length + 4));
|
||||
ms.WriteArray(BitConverter.GetBytes(client));
|
||||
ms.WriteArray(BitConverter.GetBytes(frame));
|
||||
ms.WriteArray(data);
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
||||
void DispatchOrdersToClient(Connection c, int client, int frame, byte[] data)
|
||||
{
|
||||
DispatchFrameToClient(c, client, CreateFrame(client, frame, data));
|
||||
}
|
||||
|
||||
void DispatchFrameToClient(Connection c, int client, byte[] frameData)
|
||||
{
|
||||
try
|
||||
{
|
||||
var ms = new MemoryStream(data.Length + 12);
|
||||
ms.WriteArray(BitConverter.GetBytes(data.Length + 4));
|
||||
ms.WriteArray(BitConverter.GetBytes(client));
|
||||
ms.WriteArray(BitConverter.GetBytes(frame));
|
||||
ms.WriteArray(data);
|
||||
SendData(c.Socket, ms.ToArray());
|
||||
SendData(c.Socket, frameData);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -777,8 +787,9 @@ namespace OpenRA.Server
|
||||
public void DispatchOrdersToClients(Connection conn, int frame, byte[] data)
|
||||
{
|
||||
var from = conn != null ? conn.PlayerIndex : 0;
|
||||
var frameData = CreateFrame(from, frame, data);
|
||||
foreach (var c in Conns.Except(conn).ToList())
|
||||
DispatchOrdersToClient(c, from, frame, data);
|
||||
DispatchFrameToClient(c, from, frameData);
|
||||
|
||||
if (recorder != null)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user