diff --git a/Svelto.ECS/EntityStream.cs b/Svelto.ECS/EntityStream.cs index 948d4d7..13b2649 100644 --- a/Svelto.ECS/EntityStream.cs +++ b/Svelto.ECS/EntityStream.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Concurrent; using Svelto.DataStructures; namespace Svelto.ECS @@ -15,33 +14,34 @@ namespace Svelto.ECS /// one only /// - you want to communicate between EnginesRoots /// + class EntitiesStream : IDisposable { internal Consumer GenerateConsumer(string name, uint capacity) where T : unmanaged, IEntityStruct { - if (_streams.ContainsKey(typeof(T)) == false) _streams[typeof(T)] = new EntityStream(); + if (_streams.ContainsKey(TypeRefWrapper.wrapper) == false) _streams[TypeRefWrapper.wrapper] = new EntityStream(); - return (_streams[typeof(T)] as EntityStream).GenerateConsumer(name, capacity); + return (_streams[TypeRefWrapper.wrapper] as EntityStream).GenerateConsumer(name, capacity); } public Consumer GenerateConsumer(ExclusiveGroup group, string name, uint capacity) where T : unmanaged, IEntityStruct { - if (_streams.ContainsKey(typeof(T)) == false) _streams[typeof(T)] = new EntityStream(); + if (_streams.ContainsKey(TypeRefWrapper.wrapper) == false) _streams[TypeRefWrapper.wrapper] = new EntityStream(); - return (_streams[typeof(T)] as EntityStream).GenerateConsumer(group, name, capacity); + return (_streams[TypeRefWrapper.wrapper] as EntityStream).GenerateConsumer(group, name, capacity); } internal void PublishEntity(ref T entity, EGID egid) where T : unmanaged, IEntityStruct { - if (_streams.TryGetValue(typeof(T), out var typeSafeStream)) + if (_streams.TryGetValue(TypeRefWrapper.wrapper, out var typeSafeStream)) (typeSafeStream as EntityStream).PublishEntity(ref entity, egid); else Console.LogDebug("No Consumers are waiting for this entity to change ", typeof(T)); } - readonly ConcurrentDictionary _streams = - new ConcurrentDictionary(); + readonly ThreadSafeDictionary, ITypeSafeStream> _streams = + new ThreadSafeDictionary, ITypeSafeStream>(); public void Dispose() { @@ -95,24 +95,24 @@ namespace Svelto.ECS _consumers.UnorderedRemove(consumer); } - readonly FasterListThreadSafe> _consumers = new FasterListThreadSafe>(); + readonly ThreadSafeFasterList> _consumers = new ThreadSafeFasterList>(); } public struct Consumer : IDisposable where T : unmanaged, IEntityStruct { - internal Consumer(string name, uint capacity, EntityStream stream):this() + internal Consumer(string name, uint capacity, EntityStream stream):this() { -#if DEBUG && !PROFILER +#if DEBUG && !PROFILER _name = name; #endif - _ringBuffer = new RingBuffer>((int) capacity, + _ringBuffer = new RingBuffer>((int) capacity, #if DEBUG && !PROFILER _name #else string.Empty #endif ); - + _stream = stream; } @@ -133,7 +133,7 @@ namespace Svelto.ECS var tryDequeue = _ringBuffer.TryDequeue(out var values); entity = values.Item1; - + return tryDequeue; } @@ -143,7 +143,7 @@ namespace Svelto.ECS entity = values.Item1; id = values.Item2; - + return tryDequeue; } public void Flush() { _ringBuffer.Reset(); } @@ -152,11 +152,11 @@ namespace Svelto.ECS readonly RingBuffer> _ringBuffer; readonly EntityStream _stream; - + internal readonly ExclusiveGroup _group; internal readonly bool _hasGroup; - -#if DEBUG && !PROFILER + +#if DEBUG && !PROFILER readonly string _name; #endif }