refactoring

This commit is contained in:
Mikhail 2023-06-18 18:46:19 +08:00
parent ed01cfc454
commit 28e786ca7a
4 changed files with 32 additions and 37 deletions

View File

@ -1,5 +1,5 @@
namespace DCFApixels.DragonECS
{
public sealed class EcsDefaultWorld : EcsWorld<EcsDefaultWorld> { }
public sealed class EcsEventWorld : EcsWorld<EcsEventWorld> { }
public sealed class EcsDefaultWorld : EcsWorld { }
public sealed class EcsEventWorld : EcsWorld { }
}

View File

@ -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;
/// <summary>Including constraints</summary>
internal readonly int[] _inc;
/// <summary>Excluding constraints</summary>
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

View File

@ -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<EcsNullWorld>
{
public EcsNullWorld() : base(false) { }
}
public abstract class EcsWorld<TWorldArchetype> : EcsWorld
where TWorldArchetype : EcsWorld<TWorldArchetype>
{
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

View File

@ -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<TWorldArchetype>() => WorldIndex<TWorldArchetype>.id;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetComponentID<T>(int worldID) => Component<T>.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<Type, int>();
this.worldType = worldType;
}
}
}