From ce013f17d68eefa452fd5a8760795478f32e0596 Mon Sep 17 00:00:00 2001 From: Vapre Date: Mon, 2 Nov 2020 00:08:28 +0100 Subject: [PATCH] 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. --- OpenRA.Game/Server/Server.cs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 154fa0ea31..19886d1207 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -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) {