pooling bit arrays
parent
494a583240
commit
642f8df4d5
|
@ -0,0 +1,33 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Encompass
|
||||
{
|
||||
internal class BitArrayPool
|
||||
{
|
||||
private Stack<BitArray> bitArrays;
|
||||
|
||||
public BitArrayPool(int capacity)
|
||||
{
|
||||
bitArrays = new Stack<BitArray>(capacity);
|
||||
|
||||
for (var i = 0; i < capacity; i++)
|
||||
{
|
||||
bitArrays.Push(new BitArray(128));
|
||||
}
|
||||
}
|
||||
|
||||
public BitArray Obtain(int size)
|
||||
{
|
||||
var bitArray = bitArrays.Pop();
|
||||
bitArray.Length = size;
|
||||
bitArray.SetAll(false);
|
||||
return bitArray;
|
||||
}
|
||||
|
||||
public void Free(BitArray bitArray)
|
||||
{
|
||||
bitArrays.Push(bitArray);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -81,7 +81,7 @@ namespace Encompass
|
|||
{
|
||||
entry.Remove(entity);
|
||||
}
|
||||
componentBitSet.DestroyEntity(entity);
|
||||
componentBitSet.RemoveEntity(entity);
|
||||
}
|
||||
|
||||
public bool Any<TComponent>() where TComponent : struct, IComponent
|
||||
|
|
|
@ -6,6 +6,7 @@ namespace Encompass
|
|||
{
|
||||
internal class ComponentBitSet
|
||||
{
|
||||
BitArrayPool bitArrayPool = new BitArrayPool(32768); // todo: set entity cap
|
||||
Dictionary<Entity, BitArray> entities = new Dictionary<Entity, BitArray>();
|
||||
Dictionary<Type, int> typeToIndex = new Dictionary<Type, int>();
|
||||
BitArray queryArray;
|
||||
|
@ -26,13 +27,17 @@ namespace Encompass
|
|||
|
||||
public void Clear()
|
||||
{
|
||||
foreach (var kvp in entities)
|
||||
{
|
||||
bitArrayPool.Free(kvp.Value);
|
||||
}
|
||||
entities.Clear();
|
||||
}
|
||||
|
||||
public void AddEntity(Entity entity)
|
||||
{
|
||||
var bitArray = new BitArray(typeToIndex.Count);
|
||||
entities.Add(entity, bitArray); // this is gonna create garbage!! fuck!!
|
||||
var bitArray = bitArrayPool.Obtain(typeToIndex.Count);
|
||||
entities.Add(entity, bitArray);
|
||||
}
|
||||
|
||||
public void Set<TComponent>(Entity entity) where TComponent : struct, IComponent
|
||||
|
@ -46,9 +51,13 @@ namespace Encompass
|
|||
entities[entity].Set(typeToIndex[typeof(TComponent)], false);
|
||||
}
|
||||
|
||||
public void DestroyEntity(Entity entity)
|
||||
public void RemoveEntity(Entity entity)
|
||||
{
|
||||
entities.Remove(entity);
|
||||
if (entities.ContainsKey(entity))
|
||||
{
|
||||
bitArrayPool.Free(entities[entity]);
|
||||
entities.Remove(entity);
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<Entity> EntitiesWithComponents(IEnumerable<Type> types)
|
||||
|
|
Loading…
Reference in New Issue