update hybridpool / add clear not alive components

This commit is contained in:
Mikhail 2023-07-17 15:55:23 +08:00
parent aba19f98b9
commit 0c06d971aa

View File

@ -14,7 +14,9 @@ namespace DCFApixels.DragonECS
private int[] _mapping;// index = entityID / value = itemIndex;/ value = 0 = no entityID private int[] _mapping;// index = entityID / value = itemIndex;/ value = 0 = no entityID
private T[] _items; //dense private T[] _items; //dense
private int[] _entities;
private int _itemsCount; private int _itemsCount;
private int[] _recycledItems; private int[] _recycledItems;
private int _recycledItemsCount; private int _recycledItemsCount;
@ -40,6 +42,7 @@ namespace DCFApixels.DragonECS
_recycledItems = new int[128]; _recycledItems = new int[128];
_recycledItemsCount = 0; _recycledItemsCount = 0;
_items = new T[capacity]; _items = new T[capacity];
_entities = new int[capacity];
_itemsCount = 0; _itemsCount = 0;
} }
#endregion #endregion
@ -60,12 +63,16 @@ namespace DCFApixels.DragonECS
{ {
itemIndex = ++_itemsCount; itemIndex = ++_itemsCount;
if (itemIndex >= _items.Length) if (itemIndex >= _items.Length)
{
Array.Resize(ref _items, _items.Length << 1); Array.Resize(ref _items, _items.Length << 1);
Array.Resize(ref _entities, _items.Length);
}
} }
this.IncrementEntityComponentCount(entityID); this.IncrementEntityComponentCount(entityID);
_listeners.InvokeOnAdd(entityID); _listeners.InvokeOnAdd(entityID);
component.OnAddToPool(_source.GetEntityLong(entityID)); component.OnAddToPool(_source.GetEntityLong(entityID));
_items[itemIndex] = component; _items[itemIndex] = component;
_entities[itemIndex] = entityID;
} }
public void Set(int entityID, T component) public void Set(int entityID, T component)
{ {
@ -81,7 +88,10 @@ namespace DCFApixels.DragonECS
{ {
itemIndex = ++_itemsCount; itemIndex = ++_itemsCount;
if (itemIndex >= _items.Length) if (itemIndex >= _items.Length)
{
Array.Resize(ref _items, _items.Length << 1); Array.Resize(ref _items, _items.Length << 1);
Array.Resize(ref _entities, _items.Length);
}
} }
this.IncrementEntityComponentCount(entityID); this.IncrementEntityComponentCount(entityID);
} }
@ -93,6 +103,7 @@ namespace DCFApixels.DragonECS
_listeners.InvokeOnAdd(entityID); _listeners.InvokeOnAdd(entityID);
component.OnAddToPool(_source.GetEntityLong(entityID)); component.OnAddToPool(_source.GetEntityLong(entityID));
_items[itemIndex] = component; _items[itemIndex] = component;
_entities[itemIndex] = entityID;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public T Get(int entityID) public T Get(int entityID)
@ -128,6 +139,7 @@ namespace DCFApixels.DragonECS
Array.Resize(ref _recycledItems, _recycledItems.Length << 1); Array.Resize(ref _recycledItems, _recycledItems.Length << 1);
_recycledItems[_recycledItemsCount++] = itemIndex; _recycledItems[_recycledItemsCount++] = itemIndex;
_mapping[entityID] = 0; _mapping[entityID] = 0;
_entities[itemIndex] = 0;
_itemsCount--; _itemsCount--;
this.DecrementEntityComponentCount(entityID); this.DecrementEntityComponentCount(entityID);
_listeners.InvokeOnDel(entityID); _listeners.InvokeOnDel(entityID);
@ -150,6 +162,15 @@ namespace DCFApixels.DragonECS
#endif #endif
toWorld.GetPool<T>().Set(toEntityID, Get(fromEntityID)); toWorld.GetPool<T>().Set(toEntityID, Get(fromEntityID));
} }
public void ClearNotAliveComponents()
{
for (int i = _itemsCount - 1; i >= 0; i--)
{
if (!_items[i].IsAlive)
Del(_entities[i]);
}
}
#endregion #endregion
#region Callbacks #region Callbacks