diff --git a/src/Builtin/Worlds.cs b/src/Builtin/Worlds.cs index d92e45e..8662512 100644 --- a/src/Builtin/Worlds.cs +++ b/src/Builtin/Worlds.cs @@ -1,5 +1,5 @@ namespace DCFApixels.DragonECS { - public sealed class EcsDefaultWorld : EcsWorld { } - public sealed class EcsEventWorld : EcsWorld { } + public sealed class EcsDefaultWorld : EcsWorld { } + public sealed class EcsEventWorld : EcsWorld { } } diff --git a/src/EcsSubject.cs b/src/EcsSubject.cs index eabcb21..5f5b414 100644 --- a/src/EcsSubject.cs +++ b/src/EcsSubject.cs @@ -144,7 +144,7 @@ namespace DCFApixels.DragonECS var exc = maskExc.ToArray(); Array.Sort(exc); - mask = new EcsMask(_world.Archetype, inc, exc); + mask = new EcsMask(_world.WorldTypeID, inc, exc); _world = null; _inc = null; _exc = null; @@ -202,24 +202,24 @@ namespace DCFApixels.DragonECS [DebuggerTypeProxy(typeof(DebuggerProxy))] public sealed class EcsMask { - internal readonly Type _worldType; + internal readonly int _worldTypeID; /// Including constraints internal readonly int[] _inc; /// Excluding constraints internal readonly int[] _exc; - internal EcsMask(Type worldType, int[] inc, int[] exc) + internal EcsMask(int worldTypeID, int[] inc, int[] exc) { #if DEBUG - if (worldType is null) throw new ArgumentNullException(); + if (worldTypeID == 0) throw new ArgumentException(); CheckConstraints(inc, exc); #endif - _worldType = worldType; + _worldTypeID = worldTypeID; _inc = inc; _exc = exc; } #region Object - public override string ToString() => CreateLogString(_worldType, _inc, _exc); + public override string ToString() => CreateLogString(_worldTypeID, _inc, _exc); #endregion #region Debug utils @@ -247,11 +247,10 @@ namespace DCFApixels.DragonECS return false; } #endif - private static string CreateLogString(Type worldType, int[] inc, int[] exc) + private static string CreateLogString(int worldTypeID, int[] inc, int[] exc) { #if (DEBUG && !DISABLE_DEBUG) - int worldID = WorldMetaStorage.GetWorldID(worldType); - string converter(int o) => EcsDebugUtility.GetGenericTypeName(WorldMetaStorage.GetComponentType(worldID, o), 1); + string converter(int o) => EcsDebugUtility.GetGenericTypeName(WorldMetaStorage.GetComponentType(worldTypeID, o), 1); return $"Inc({string.Join(", ", inc.Select(converter))}) Exc({string.Join(", ", exc.Select(converter))})"; #else return $"Inc({string.Join(", ", inc)}) Exc({string.Join(", ", exc)})"; // Release optimization @@ -260,21 +259,22 @@ namespace DCFApixels.DragonECS internal class DebuggerProxy { public readonly Type worldType; + public readonly int worldTypeID; public readonly int[] included; public readonly int[] excluded; public readonly Type[] includedTypes; public readonly Type[] excludedTypes; public DebuggerProxy(EcsMask mask) { - worldType = mask._worldType; - int worldID = WorldMetaStorage.GetWorldID(worldType); + worldType = WorldMetaStorage.GetWorldType(mask._worldTypeID); + worldTypeID = mask._worldTypeID; included = mask._inc; excluded = mask._exc; - Type converter(int o) => WorldMetaStorage.GetComponentType(worldID, o); + Type converter(int o) => WorldMetaStorage.GetComponentType(worldTypeID, o); includedTypes = included.Select(converter).ToArray(); excludedTypes = excluded.Select(converter).ToArray(); } - public override string ToString() => CreateLogString(worldType, included, excluded); + public override string ToString() => CreateLogString(worldTypeID, included, excluded); } #endregion diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 59ce99a..135a4d3 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -18,6 +18,7 @@ namespace DCFApixels.DragonECS public readonly short id; + private Type _worldType; private int _worldTypeID; private IntDispenser _entityDispenser; @@ -45,7 +46,7 @@ namespace DCFApixels.DragonECS private object[] _components = new object[2]; #region Properties - public abstract Type Archetype { get; } + public int WorldTypeID => _worldTypeID; public int Count => _entitiesCount; public int Capacity => _entitesCapacity; //_denseEntities.Length; public EcsReadonlyGroup Entities => _allEntites.Readonly; @@ -67,7 +68,8 @@ namespace DCFApixels.DragonECS Worlds[id] = this; } - _worldTypeID = WorldMetaStorage.GetWorldID(Archetype); + _worldType = this.GetType(); + _worldTypeID = WorldMetaStorage.GetWorldID(_worldType); _entityDispenser = new IntDispenser(0); _pools = new IEcsPoolImplementation[512]; @@ -274,7 +276,7 @@ namespace DCFApixels.DragonECS public bool IsMatchesMask(EcsMask mask, int entityID) { #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS - if (mask._worldType != Archetype) + if (mask._worldTypeID != _worldTypeID) throw new EcsFrameworkException("The types of the target world of the mask and this world are different."); #endif for (int i = 0, iMax = mask._inc.Length; i < iMax; i++) @@ -405,18 +407,7 @@ namespace DCFApixels.DragonECS #endregion } - internal sealed class EcsNullWorld : EcsWorld - { - public EcsNullWorld() : base(false) { } - } - - public abstract class EcsWorld : EcsWorld - where TWorldArchetype : EcsWorld - { - public override Type Archetype => typeof(TWorldArchetype); - public EcsWorld() : base() { } - internal EcsWorld(bool isIndexable) : base(isIndexable) { } - } + internal sealed class EcsNullWorld : EcsWorld { } #region Callbacks Interface public interface IEcsWorldComponent diff --git a/src/Utils/WorldMetaStorage.cs b/src/Utils/WorldMetaStorage.cs index 5b36a5b..3eca92b 100644 --- a/src/Utils/WorldMetaStorage.cs +++ b/src/Utils/WorldMetaStorage.cs @@ -16,9 +16,9 @@ namespace DCFApixels.DragonECS { public static int id = GetWorldID(typeof(TWorldArchetype)); } - private static int GetToken() + private static int GetToken(Type worldType) { - WorldTypeMeta meta = new WorldTypeMeta(); + WorldTypeMeta meta = new WorldTypeMeta(worldType); meta.id = _tokenCount; Array.Resize(ref _metas, ++_tokenCount); _metas[_tokenCount - 1] = meta; @@ -28,16 +28,18 @@ namespace DCFApixels.DragonECS return _tokenCount - 1; } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int GetWorldID(Type archetype) + public static int GetWorldID(Type worldType) { - if (!_worldIds.TryGetValue(archetype, out int id)) + if (!_worldIds.TryGetValue(worldType, out int id)) { - id = GetToken(); - _worldIds.Add(archetype, id); + id = GetToken(worldType); + _worldIds.Add(worldType, id); } return id; } [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Type GetWorldType(int worldTypeID) => _metas[worldTypeID].worldType; + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetWorldID() => WorldIndex.id; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetComponentID(int worldID) => Component.Get(worldID); @@ -255,6 +257,7 @@ namespace DCFApixels.DragonECS public struct XXX : IEcsComponent { } private class WorldTypeMeta { + public readonly Type worldType; public int id; public int componentCount; public int subjectsCount; @@ -276,10 +279,11 @@ namespace DCFApixels.DragonECS { return PoolComponentIdArrays.GetComponentID(type, id); } - public WorldTypeMeta() + public WorldTypeMeta(Type worldType) { _types = new Type[10]; _declaredComponentTypes = new Dictionary(); + this.worldType = worldType; } } }