From f585140f70a30779b05e3d29514ae0b1c2e264d0 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:08:44 +0800 Subject: [PATCH] fix entity gen management --- src/EcsWorld.cs | 17 ++++++++--------- src/EcsWorld.static.cs | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 8b47512..fcd6175 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -290,10 +290,9 @@ namespace DCFApixels.DragonECS _entitiesCount++; ref var slot = ref _entities[entityID]; slot.isUsed = true; - if (slot.gen >= 0) - { //если gen был пробужен у не мертвой сущности, то для отличия от мертвой, нужно инкрементировать и усыпить - slot.gen++; - slot.gen &= SLEEP_GEN_MASK; + if (slot.gen >= GEN_STATUS_SEPARATOR) + { + slot.gen |= GEN_SLEEP_MASK; } _entityListeners.InvokeOnNewEntity(entityID); } @@ -374,10 +373,10 @@ namespace DCFApixels.DragonECS unchecked { ref var slotGen = ref _entities[entityID].gen; - if (slotGen < 0) - { //если gen меньше 0 значит он спящий, спящие нужно инкремировать + if (slotGen < GEN_STATUS_SEPARATOR) + { //если gen меньше 0 значит он спящий, спящие нужно инкремировать перед выдачей slotGen++; - slotGen &= WAKE_UP_GEN_MASK; + slotGen &= GEN_WAKEUP_MASK; } return slotGen; } @@ -719,7 +718,7 @@ namespace DCFApixels.DragonECS { int e = buffer[i]; _entityDispenser.Release(e); - _entities[e].gen |= SLEEPING_GEN_FLAG; + _entities[e].gen |= GEN_SLEEP_MASK; } Densify(); } @@ -1061,7 +1060,7 @@ namespace DCFApixels.DragonECS [StructLayout(LayoutKind.Sequential)] private struct EntitySlot { - public static readonly EntitySlot Empty = new EntitySlot(SLEEPING_GEN_FLAG, 0, false); + public static readonly EntitySlot Empty = new EntitySlot(GEN_SLEEP_MASK, 0, false); public short gen; public short componentsCount; public bool isUsed; diff --git a/src/EcsWorld.static.cs b/src/EcsWorld.static.cs index 998fc09..fa24cef 100644 --- a/src/EcsWorld.static.cs +++ b/src/EcsWorld.static.cs @@ -19,10 +19,10 @@ namespace DCFApixels.DragonECS { private const short NULL_WORLD_ID = 0; - private const short WAKE_UP_GEN_MASK = 0x7fff; - private const short SLEEP_GEN_MASK = ~WAKE_UP_GEN_MASK; + private const short GEN_STATUS_SEPARATOR = 0; + private const short GEN_WAKEUP_MASK = 0x7fff; + private const short GEN_SLEEP_MASK = ~GEN_WAKEUP_MASK; - private const short SLEEPING_GEN_FLAG = short.MinValue; private const int DEL_ENT_BUFFER_SIZE_OFFSET = 5; private const int DEL_ENT_BUFFER_MIN_SIZE = 64;