From 5a536e6123a3feb40b46e34562d081010873d90c Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Sun, 22 Mar 2020 13:53:23 -0700 Subject: [PATCH] optimize singular entity message read --- encompass-cs/Collections/MessageStore.cs | 5 +++++ encompass-cs/Collections/TypedMessageStore.cs | 9 +++++++-- encompass-cs/MessageManager.cs | 6 ++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/encompass-cs/Collections/MessageStore.cs b/encompass-cs/Collections/MessageStore.cs index 4d44657..632cfd3 100644 --- a/encompass-cs/Collections/MessageStore.cs +++ b/encompass-cs/Collections/MessageStore.cs @@ -53,6 +53,11 @@ namespace Encompass return Lookup().WithEntity(entityID); } + public ref readonly TMessage FirstWithEntity(int entityID) where TMessage : struct, IMessage + { + return ref Lookup().FirstWithEntity(entityID); + } + public bool SomeWithEntity(int entityID) where TMessage : struct, IMessage, IHasEntity { return Lookup().SomeWithEntity(entityID); diff --git a/encompass-cs/Collections/TypedMessageStore.cs b/encompass-cs/Collections/TypedMessageStore.cs index b43f129..3e8d815 100644 --- a/encompass-cs/Collections/TypedMessageStore.cs +++ b/encompass-cs/Collections/TypedMessageStore.cs @@ -17,7 +17,7 @@ namespace Encompass private readonly TMessage[] _store = new TMessage[128]; private readonly List<(TMessage, double)> _delayedStore = new List<(TMessage, double)>(128); private readonly List<(TMessage, double)> _delayedStoreIgnoringTimeDilation = new List<(TMessage, double)>(128); - private readonly Dictionary> _entityToIndices = new Dictionary>(); + private readonly Dictionary> _entityToIndices = new Dictionary>(); public override void ProcessDelayedMessages(double dilatedDelta, double realtimeDelta) { @@ -63,7 +63,7 @@ namespace Encompass if (message is IHasEntity entityMessage) { var entityID = entityMessage.Entity.ID; - if (!_entityToIndices.ContainsKey(entityID)) { _entityToIndices.Add(entityID, new HashSet()); } + if (!_entityToIndices.ContainsKey(entityID)) { _entityToIndices.Add(entityID, new List()); } _entityToIndices[entityID].Add(index); } } @@ -104,6 +104,11 @@ namespace Encompass } } + public ref readonly TMessage FirstWithEntity(int entityID) + { + return ref _store[_entityToIndices[entityID][0]]; + } + public bool SomeWithEntity(int entityID) { return _entityToIndices.ContainsKey(entityID) && _entityToIndices[entityID].Count > 0; diff --git a/encompass-cs/MessageManager.cs b/encompass-cs/MessageManager.cs index 0ee4dc2..1e7d704 100644 --- a/encompass-cs/MessageManager.cs +++ b/encompass-cs/MessageManager.cs @@ -58,11 +58,9 @@ namespace Encompass return _messageStore.WithEntity(entityID); } - internal TMessage WithEntitySingular(int entityID) where TMessage : struct, IMessage, IHasEntity + internal ref readonly TMessage WithEntitySingular(int entityID) where TMessage : struct, IMessage, IHasEntity { - var enumerator = _messageStore.WithEntity(entityID).GetEnumerator(); - enumerator.MoveNext(); - return enumerator.Current; + return ref _messageStore.FirstWithEntity(entityID); } internal bool SomeWithEntity(int entityID) where TMessage : struct, IMessage, IHasEntity