mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 18:14:37 +08:00
fix create/delete entity methods
This commit is contained in:
parent
514cf706e5
commit
54b88a3a98
@ -1,18 +1,18 @@
|
|||||||
namespace DCFApixels.DragonECS
|
namespace DCFApixels.DragonECS
|
||||||
{
|
{
|
||||||
//TODO использовать этот мир для холостых вызовов. чтоб все нулевые ентити стучались в него, так можно попробовать сократить число проверок
|
//TODO использовать этот мир для холостых вызовов. чтоб все нулевые ентити стучались в него, так можно попробовать сократить число проверок
|
||||||
//internal sealed class EcsDeathWrold : EcsWorld<EcsDefaultWrold>
|
//internal sealed class EcsDeathWrold : EcsWorld<EcsDefaultWorld>
|
||||||
//{
|
//{
|
||||||
// public EcsDeathWrold(EcsPipeline pipeline) : base(pipeline) { }
|
// public EcsDeathWrold(EcsPipeline pipeline) : base(pipeline) { }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
public sealed class EcsDefaultWrold : EcsWorld<EcsDefaultWrold>
|
public sealed class EcsDefaultWorld : EcsWorld<EcsDefaultWorld>
|
||||||
{
|
{
|
||||||
public EcsDefaultWrold(EcsPipeline pipeline = null) : base(pipeline) { }
|
public EcsDefaultWorld(EcsPipeline pipeline = null) : base(pipeline) { }
|
||||||
}
|
}
|
||||||
public sealed class EcsEventWrold : EcsWorld<EcsEventWrold>
|
public sealed class EcsEventWorld : EcsWorld<EcsEventWorld>
|
||||||
{
|
{
|
||||||
public EcsEventWrold(EcsPipeline pipeline = null) : base(pipeline) { }
|
public EcsEventWorld(EcsPipeline pipeline = null) : base(pipeline) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,9 @@ namespace DCFApixels.DragonECS
|
|||||||
|
|
||||||
public abstract class EcsWorld : IEcsWorld
|
public abstract class EcsWorld : IEcsWorld
|
||||||
{
|
{
|
||||||
|
private const short GEN_BITS = 0x7fff;
|
||||||
|
private const short DEATH_GEN_BIT = short.MinValue;
|
||||||
|
|
||||||
public static EcsWorld[] Worlds = new EcsWorld[8];
|
public static EcsWorld[] Worlds = new EcsWorld[8];
|
||||||
private static IntDispenser _worldIdDispenser = new IntDispenser(0);
|
private static IntDispenser _worldIdDispenser = new IntDispenser(0);
|
||||||
public readonly short uniqueID;
|
public readonly short uniqueID;
|
||||||
@ -72,6 +75,8 @@ namespace DCFApixels.DragonECS
|
|||||||
#region Constructors/Destroy
|
#region Constructors/Destroy
|
||||||
public EcsWorld(EcsPipeline pipline)
|
public EcsWorld(EcsPipeline pipline)
|
||||||
{
|
{
|
||||||
|
_entitesCapacity = 512;
|
||||||
|
|
||||||
uniqueID = (short)_worldIdDispenser.GetFree();
|
uniqueID = (short)_worldIdDispenser.GetFree();
|
||||||
if (uniqueID >= Worlds.Length)
|
if (uniqueID >= Worlds.Length)
|
||||||
Array.Resize(ref Worlds, Worlds.Length << 1);
|
Array.Resize(ref Worlds, Worlds.Length << 1);
|
||||||
@ -86,10 +91,10 @@ namespace DCFApixels.DragonECS
|
|||||||
_pools = new EcsPoolBase[512];
|
_pools = new EcsPoolBase[512];
|
||||||
ArrayUtility.Fill(_pools, _nullPool);
|
ArrayUtility.Fill(_pools, _nullPool);
|
||||||
|
|
||||||
_gens = new short[512];
|
_gens = new short[_entitesCapacity];
|
||||||
_entitesCapacity = _gens.Length;
|
ArrayUtility.Fill(_gens, DEATH_GEN_BIT);
|
||||||
_delEntBufferCount = 0;
|
_delEntBufferCount = 0;
|
||||||
_delEntBuffer = new int[_gens.Length >> DEL_ENT_BUFFER_SIZE_OFFSET];
|
_delEntBuffer = new int[_entitesCapacity >> DEL_ENT_BUFFER_SIZE_OFFSET];
|
||||||
|
|
||||||
_groups = new List<WeakReference<EcsGroup>>();
|
_groups = new List<WeakReference<EcsGroup>>();
|
||||||
_allEntites = GetGroupFromPool();
|
_allEntites = GetGroupFromPool();
|
||||||
@ -193,7 +198,9 @@ namespace DCFApixels.DragonECS
|
|||||||
if (_gens.Length <= entityID)
|
if (_gens.Length <= entityID)
|
||||||
{
|
{
|
||||||
Array.Resize(ref _gens, _gens.Length << 1);
|
Array.Resize(ref _gens, _gens.Length << 1);
|
||||||
|
ArrayUtility.Fill(_gens, DEATH_GEN_BIT, _entitesCapacity);
|
||||||
_entitesCapacity = _gens.Length;
|
_entitesCapacity = _gens.Length;
|
||||||
|
|
||||||
for (int i = 0; i < _groups.Count; i++)
|
for (int i = 0; i < _groups.Count; i++)
|
||||||
{
|
{
|
||||||
if (_groups[i].TryGetTarget(out EcsGroup group))
|
if (_groups[i].TryGetTarget(out EcsGroup group))
|
||||||
@ -210,8 +217,9 @@ namespace DCFApixels.DragonECS
|
|||||||
foreach (var item in _pools)
|
foreach (var item in _pools)
|
||||||
item.InvokeOnWorldResize(_gens.Length);
|
item.InvokeOnWorldResize(_gens.Length);
|
||||||
}
|
}
|
||||||
_gens[entityID] |= short.MinValue;
|
_gens[entityID] &= GEN_BITS;
|
||||||
EcsEntity entity = new EcsEntity(entityID, _gens[entityID]++, uniqueID);
|
EcsEntity entity = new EcsEntity(entityID, ++_gens[entityID], uniqueID);
|
||||||
|
UnityEngine.Debug.Log($"{entityID} {_gens[entityID]} {uniqueID}");
|
||||||
_entityCreate.OnEntityCreate(entity);
|
_entityCreate.OnEntityCreate(entity);
|
||||||
_allEntites.Add(entityID);
|
_allEntites.Add(entityID);
|
||||||
return entity;
|
return entity;
|
||||||
@ -220,7 +228,7 @@ namespace DCFApixels.DragonECS
|
|||||||
{
|
{
|
||||||
_allEntites.Remove(entity.id);
|
_allEntites.Remove(entity.id);
|
||||||
_delEntBuffer[_delEntBufferCount++] = entity.id;
|
_delEntBuffer[_delEntBufferCount++] = entity.id;
|
||||||
_gens[entity.id] |= short.MinValue;
|
_gens[entity.id] |= DEATH_GEN_BIT;
|
||||||
_entitiesCount--;
|
_entitiesCount--;
|
||||||
_entityDestry.OnEntityDestroy(entity);
|
_entityDestry.OnEntityDestroy(entity);
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@ namespace DCFApixels.DragonECS
|
|||||||
public static readonly EcsEntity NULL = default;
|
public static readonly EcsEntity NULL = default;
|
||||||
[FieldOffset(0)]
|
[FieldOffset(0)]
|
||||||
internal readonly long full; //Union
|
internal readonly long full; //Union
|
||||||
[FieldOffset(3)]
|
|
||||||
public readonly int id;
|
|
||||||
[FieldOffset(1)]
|
|
||||||
public readonly short gen;
|
|
||||||
[FieldOffset(0)]
|
[FieldOffset(0)]
|
||||||
|
public readonly int id;
|
||||||
|
[FieldOffset(4)]
|
||||||
|
public readonly short gen;
|
||||||
|
[FieldOffset(6)]
|
||||||
public readonly short world;
|
public readonly short world;
|
||||||
|
|
||||||
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
//[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
Loading…
Reference in New Issue
Block a user