From c541b0ee03000aa58e24154decdeaa823345c27b Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Thu, 3 Nov 2016 18:35:50 +0100 Subject: [PATCH] Drastically increased network performance --- .../FluckyGame.Client/client.json | 6 +- src/FluckyGame.Library/Packet.cs | 62 +++++++++++++++++-- src/FluckyGame.Server/BouncingEntity.cs | 12 ++-- src/FluckyGame.Server/Client.cs | 59 ++++++++++-------- 4 files changed, 101 insertions(+), 38 deletions(-) diff --git a/src/FluckyGame.Client/FluckyGame.Client/client.json b/src/FluckyGame.Client/FluckyGame.Client/client.json index 222963b..0d03e90 100644 --- a/src/FluckyGame.Client/FluckyGame.Client/client.json +++ b/src/FluckyGame.Client/FluckyGame.Client/client.json @@ -1,8 +1,8 @@ { "resolution": { - "width": 3840, - "height": 2160, - "fullscreen": true + "width": 1366, + "height": 768, + "fullscreen": false }, "server": { "hostname": "localhost", diff --git a/src/FluckyGame.Library/Packet.cs b/src/FluckyGame.Library/Packet.cs index f7e56fe..ec9db3e 100644 --- a/src/FluckyGame.Library/Packet.cs +++ b/src/FluckyGame.Library/Packet.cs @@ -9,11 +9,13 @@ namespace FluckyGame.Library [Serializable] public class Packet : Dictionary { - private static readonly IFormatter formatter; + MemoryStream memoryStream; + + private static readonly Queue formatters; static Packet() { - formatter = new BinaryFormatter(); + formatters = new Queue(); } public Packet() : base() { } @@ -32,7 +34,27 @@ namespace FluckyGame.Library public static Packet Receive(Stream stream) { - var obj = formatter.Deserialize(stream); + IFormatter formatter; + + lock(formatters) + { + if (formatters.Count == 0) + formatter = new BinaryFormatter(); + else + formatter = formatters.Dequeue(); + } + + object obj; + + try + { + obj = formatter.Deserialize(stream); + } + finally + { + lock (formatters) + formatters.Enqueue(formatter); + } var packet = obj as Packet; if (packet == null) @@ -41,9 +63,41 @@ namespace FluckyGame.Library return packet; } + public void ClearCache() + { + memoryStream = null; + } + public void Send(Stream stream) { - formatter.Serialize(stream, this); + IFormatter formatter; + + lock (formatters) + { + if (formatters.Count == 0) + formatter = new BinaryFormatter(); + else + formatter = formatters.Dequeue(); + } + + if (memoryStream == null) + { + memoryStream = new MemoryStream(); + + try + { + formatter.Serialize(memoryStream, this); + } + finally + { + lock (formatters) + formatters.Enqueue(formatter); + } + } + + memoryStream.Seek(0, SeekOrigin.Begin); + + memoryStream.CopyTo(stream); } } } diff --git a/src/FluckyGame.Server/BouncingEntity.cs b/src/FluckyGame.Server/BouncingEntity.cs index 0677f90..a2aad48 100644 --- a/src/FluckyGame.Server/BouncingEntity.cs +++ b/src/FluckyGame.Server/BouncingEntity.cs @@ -28,13 +28,15 @@ namespace FluckyGame.Server Position.Y += ySpeed; + var packet = new Packet() { + {"type", "UPDATE" }, + {"id", Id }, + {"position", Position } + }; + lock (Program.clients) foreach (var client in Program.clients) - client.SendPacket(new Packet() { - {"type", "UPDATE" }, - {"id", Id }, - {"position", Position } - }); + client.SendPacket(packet); } } } diff --git a/src/FluckyGame.Server/Client.cs b/src/FluckyGame.Server/Client.cs index 86b7750..a801c91 100644 --- a/src/FluckyGame.Server/Client.cs +++ b/src/FluckyGame.Server/Client.cs @@ -35,17 +35,19 @@ namespace FluckyGame.Server Program.entities.Add(playerEntity = new Entity(Guid.NewGuid().ToString(), "dude", Vector3.Zero, Vector3.Zero, new Vector3(1))); + var packet = new Packet() { + {"type", "NEW" }, + {"id", playerEntity.Id }, + {"model", playerEntity.Model }, + {"position", playerEntity.Position }, + {"rotation", playerEntity.Rotation }, + {"scalation", playerEntity.Scalation } + }; + lock (Program.clients) foreach (var client in Program.clients) if(client != this) - client.SendPacket(new Packet() { - {"type", "NEW" }, - {"id", playerEntity.Id }, - {"model", playerEntity.Model }, - {"position", playerEntity.Position }, - {"rotation", playerEntity.Rotation }, - {"scalation", playerEntity.Scalation } - }); + client.SendPacket(packet); } thread = new Thread(ReceivePackets); @@ -77,16 +79,18 @@ namespace FluckyGame.Server Program.entities.Add(entity); + var newPacket = new Packet() { + {"type", "NEW" }, + {"id", entity.Id }, + {"model", entity.Model }, + {"position", entity.Position }, + {"rotation", entity.Rotation }, + {"scalation", entity.Scalation } + }; + lock (Program.clients) foreach (var client in Program.clients) - client.SendPacket(new Packet() { - {"type", "NEW" }, - {"id", entity.Id }, - {"model", entity.Model }, - {"position", entity.Position }, - {"rotation", entity.Rotation }, - {"scalation", entity.Scalation } - }); + client.SendPacket(newPacket); } } else if (type == "PLAYER") @@ -94,15 +98,17 @@ namespace FluckyGame.Server playerEntity.Position = (Vector3)packet["position"]; playerEntity.Rotation = (Vector3)packet["rotation"]; + var newPacket = new Packet() { + {"type", "UPDATE" }, + {"id", playerEntity.Id }, + {"position", playerEntity.Position }, + {"rotation", playerEntity.Rotation } + }; + lock (Program.clients) foreach (var client in Program.clients) if(client != this) - client.SendPacket(new Packet() { - {"type", "UPDATE" }, - {"id", playerEntity.Id }, - {"position", playerEntity.Position }, - {"rotation", playerEntity.Rotation } - }); + client.SendPacket(newPacket); } else throw new Exception("Unknown packet type!"); @@ -116,12 +122,13 @@ namespace FluckyGame.Server Program.clients.Remove(this); lock (Program.entities) Program.entities.Remove(playerEntity); + var newPacket = new Packet() { + { "type", "REMOVE" }, + { "id", playerEntity.Id } + }; lock (Program.clients) foreach (var client in Program.clients) - client.SendPacket(new Packet() { - { "type", "REMOVE" }, - { "id", playerEntity.Id } - }); + client.SendPacket(newPacket); networkStream.Dispose(); tcpClient.Dispose(); return;