From e624f6917651b3a8211164a43e8ceff79b00fa6e Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Thu, 15 Oct 2020 05:15:07 +0200 Subject: [PATCH] Improve BufferMessageReader, reduce complexity and slicing --- .../Net/Messages/IMessageReader.cs | 14 ++-- src/Impostor.Server.Hazel/HazelConnection.cs | 1 + src/Impostor.Server.Hazel/HazelMatchmaker.cs | 1 + .../Messages/BufferMessageReader.cs | 72 ++++++++----------- .../Messages/HazelConnectionMessageWriter.cs | 2 +- .../Messages/HazelGameMessageWriter.cs | 3 +- .../Messages/HazelMessage.cs | 5 +- .../Messages/HazelMessageWriter.cs | 3 +- src/Impostor.Server/Net/Client.cs | 2 + 9 files changed, 50 insertions(+), 53 deletions(-) diff --git a/src/Impostor.Server.Api/Net/Messages/IMessageReader.cs b/src/Impostor.Server.Api/Net/Messages/IMessageReader.cs index b080823..aeefcc6 100644 --- a/src/Impostor.Server.Api/Net/Messages/IMessageReader.cs +++ b/src/Impostor.Server.Api/Net/Messages/IMessageReader.cs @@ -5,9 +5,9 @@ namespace Impostor.Server.Net.Messages public interface IMessageReader { /// - /// Gets the current position of the reader. + /// Gets the tag of the message. /// - int Position { get; } + byte Tag { get; } /// /// Gets the buffer of the message. @@ -15,15 +15,17 @@ namespace Impostor.Server.Net.Messages ReadOnlyMemory Buffer { get; } /// - /// Gets the tag of the message. + /// Gets the current position of the reader. /// - byte Tag { get; } + int Position { get; } /// /// Gets the length of the buffer. /// int Length { get; } + IMessageReader ReadMessage(); + bool ReadBoolean(); sbyte ReadSByte(); @@ -51,5 +53,9 @@ namespace Impostor.Server.Net.Messages uint ReadPackedUInt32(); void CopyTo(IMessageWriter writer); + + IMessageReader Slice(int start); + + IMessageReader Slice(int start, int length); } } \ No newline at end of file diff --git a/src/Impostor.Server.Hazel/HazelConnection.cs b/src/Impostor.Server.Hazel/HazelConnection.cs index da8273f..a8edb03 100644 --- a/src/Impostor.Server.Hazel/HazelConnection.cs +++ b/src/Impostor.Server.Hazel/HazelConnection.cs @@ -3,6 +3,7 @@ using System.Collections.Concurrent; using System.Net; using System.Threading.Tasks; using Hazel; +using Impostor.Server.Hazel.Messages; using Impostor.Server.Net; using Impostor.Server.Net.Messages; using Microsoft.Extensions.Logging; diff --git a/src/Impostor.Server.Hazel/HazelMatchmaker.cs b/src/Impostor.Server.Hazel/HazelMatchmaker.cs index 01c7c22..b4f8fad 100644 --- a/src/Impostor.Server.Hazel/HazelMatchmaker.cs +++ b/src/Impostor.Server.Hazel/HazelMatchmaker.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Hazel; using Hazel.Udp; using Impostor.Server.Games; +using Impostor.Server.Hazel.Messages; using Impostor.Server.Net; using Impostor.Server.Net.Manager; using Impostor.Server.Net.Messages; diff --git a/src/Impostor.Server.Hazel/Messages/BufferMessageReader.cs b/src/Impostor.Server.Hazel/Messages/BufferMessageReader.cs index 4ced4f3..5ff0fab 100644 --- a/src/Impostor.Server.Hazel/Messages/BufferMessageReader.cs +++ b/src/Impostor.Server.Hazel/Messages/BufferMessageReader.cs @@ -1,41 +1,32 @@ using System; using System.Runtime.CompilerServices; using System.Text; -using Impostor.Server.Net; using Impostor.Server.Net.Messages; -namespace Impostor.Server.Hazel +namespace Impostor.Server.Hazel.Messages { public class BufferMessageReader : IMessageReader { - // TODO: Remove _offset, we can slice the buffer. - private readonly int _offset; - private int _position; - private int readHead; - - public ReadOnlyMemory Buffer { get; } - public byte Tag { get; } + public ReadOnlyMemory Buffer { get; } + public int Position { get; set; } + public int Length => Buffer.Length; - public int Length { get; } - - public int Position + public BufferMessageReader(byte tag, ReadOnlyMemory buffer) { - get { return _position; } - set - { - _position = value; - readHead = value + _offset; - } + Tag = tag; + Buffer = buffer; } - public BufferMessageReader(byte tag, ReadOnlyMemory buffer, int offset, int length) + public IMessageReader ReadMessage() { - Tag = tag; - Buffer = buffer; - Length = length; - _offset = offset; - readHead = offset; + var length = ReadUInt16(); + var tag = ReadByte(); + var pos = Position; + + Position += length; + + return new BufferMessageReader(tag, Buffer.Slice(pos, length)); } public bool ReadBoolean() @@ -102,7 +93,7 @@ namespace Impostor.Server.Hazel // TODO: Refactor to System.Buffers.Binary.BinaryPrimitives float output = 0; - fixed (byte* bufPtr = &Buffer.Span[readHead]) + fixed (byte* bufPtr = &Buffer.Span[Position]) { byte* outPtr = (byte*)&output; @@ -119,7 +110,7 @@ namespace Impostor.Server.Hazel public string ReadString() { var len = ReadPackedInt32(); - var output = Encoding.UTF8.GetString(Buffer.Span.Slice(readHead, len)); + var output = Encoding.UTF8.GetString(Buffer.Span.Slice(Position, len)); Position += len; return output; } @@ -132,7 +123,7 @@ namespace Impostor.Server.Hazel public ReadOnlyMemory ReadBytes(int length) { - var output = Buffer.Slice(readHead, length); + var output = Buffer.Slice(Position, length); Position += length; return output; } @@ -170,26 +161,25 @@ namespace Impostor.Server.Hazel public void CopyTo(IMessageWriter writer) { - int offset, length; - if (Tag == byte.MaxValue) - { - offset = _offset; - length = Length; - } - else - { - offset = _offset - 3; - length = Length + 3; - } + writer.Write((ushort) Length); + writer.Write((byte) Tag); + writer.Write(Buffer); + } - writer.Write(Buffer.Slice(offset, length)); + public IMessageReader Slice(int start) + { + return new BufferMessageReader(Tag, Buffer.Slice(start)); + } + + public IMessageReader Slice(int start, int length) + { + return new BufferMessageReader(Tag, Buffer.Slice(start, length)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private byte FastByte() { - _position++; - return Buffer.Span[readHead++]; + return Buffer.Span[Position++]; } } } \ No newline at end of file diff --git a/src/Impostor.Server.Hazel/Messages/HazelConnectionMessageWriter.cs b/src/Impostor.Server.Hazel/Messages/HazelConnectionMessageWriter.cs index 96f8601..3b06c50 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelConnectionMessageWriter.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelConnectionMessageWriter.cs @@ -2,7 +2,7 @@ using Impostor.Server.Net; using Impostor.Server.Net.Messages; -namespace Impostor.Server.Hazel +namespace Impostor.Server.Hazel.Messages { internal class HazelConnectionMessageWriter : HazelMessageWriter, IConnectionMessageWriter { diff --git a/src/Impostor.Server.Hazel/Messages/HazelGameMessageWriter.cs b/src/Impostor.Server.Hazel/Messages/HazelGameMessageWriter.cs index 1f09ce7..e99533b 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelGameMessageWriter.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelGameMessageWriter.cs @@ -6,9 +6,8 @@ using Hazel; using Impostor.Server.Games; using Impostor.Server.Net; using Impostor.Server.Net.Messages; -using Impostor.Shared.Innersloth.Data; -namespace Impostor.Server.Hazel +namespace Impostor.Server.Hazel.Messages { internal class HazelGameMessageWriter : HazelMessageWriter, IGameMessageWriter { diff --git a/src/Impostor.Server.Hazel/Messages/HazelMessage.cs b/src/Impostor.Server.Hazel/Messages/HazelMessage.cs index 70845c3..9339cb0 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelMessage.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelMessage.cs @@ -1,9 +1,8 @@ using System; using Hazel; -using Impostor.Server.Net; using Impostor.Server.Net.Messages; -namespace Impostor.Server.Hazel +namespace Impostor.Server.Hazel.Messages { internal class HazelMessage : IMessage, IDisposable { @@ -25,7 +24,7 @@ namespace Impostor.Server.Hazel throw new ObjectDisposedException(nameof(_reader)); } - return new BufferMessageReader(_reader.Tag, _reader.Buffer, _reader.Offset, _reader.Length); + return new BufferMessageReader(_reader.Tag, _reader.Buffer.AsMemory(_reader.Offset, _reader.Length)); } private void Dispose(bool disposing) diff --git a/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs b/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs index da046f7..83147b4 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs @@ -2,10 +2,9 @@ using System.Net; using Hazel; using Impostor.Server.Games; -using Impostor.Server.Net; using Impostor.Server.Net.Messages; -namespace Impostor.Server.Hazel +namespace Impostor.Server.Hazel.Messages { internal abstract class HazelMessageWriter : IMessageWriter { diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index 61ff3f8..42f9c91 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -1,8 +1,10 @@ using System; using System.Threading.Tasks; +using Hazel; using Impostor.Server.Data; using Impostor.Server.Games; using Impostor.Server.Games.Managers; +using Impostor.Server.Hazel.Messages; using Impostor.Server.Net.Manager; using Impostor.Server.Net.Messages; using Impostor.Shared.Innersloth; -- 2.39.5