diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index ea7ba15..2129adb 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using UnityEditor.Search; namespace DCFApixels.DragonECS { @@ -43,14 +42,18 @@ namespace DCFApixels.DragonECS public abstract class EcsWorld : EcsWorld, IEcsWorld where TWorldArchetype : EcsWorld { + private const int DEL_ENT_BUFFER_SIZE_OFFSET = 2; private readonly int _worldArchetypeID = ComponentIndexer.GetWorldId(); private IntDispenser _entityDispenser; private int _entitiesCount; private int _entitesCapacity; private short[] _gens; //старший бит указывает на то жива ли сущьность. - private EcsGroup _allEntites; //private short[] _componentCounts; //TODO + private EcsGroup _allEntites; + + private int[] _delEntBuffer; //буфер удаления нужен для того чтобы запускать некоторые процесыы связанные с удалением сущьности не по одному при каждом удалении, а пачкой + private int _delEntBufferCount; private EcsPool[] _pools; private EcsNullPool _nullPool; @@ -93,6 +96,8 @@ namespace DCFApixels.DragonECS _gens = new short[512]; _entitesCapacity = _gens.Length; + _delEntBufferCount = 0; + _delEntBuffer = new int[_gens.Length >> DEL_ENT_BUFFER_SIZE_OFFSET]; _groups = new List>(); _allEntites = GetGroupFromPool(); @@ -128,17 +133,9 @@ namespace DCFApixels.DragonECS } #endregion - #region Query + #region Queries public TQuery Where(out TQuery query) where TQuery : EcsQueryBase { - //int uniqueID = QueryType.uniqueID; - //if (_queries.Length < QueryType.capacity) - // Array.Resize(ref _queries, QueryType.capacity); - //if (_queries[uniqueID] == null) - // _queries[uniqueID] = EcsQueryBase.Builder.Build(this); - //query = (TQuery)_queries[uniqueID]; - //query.Where(); - //return query; query = Select(); query.Execute(); return query; @@ -215,10 +212,20 @@ namespace DCFApixels.DragonECS public void DelEntity(EcsEntity entity) { _allEntites.Remove(entity.id); - _entityDispenser.Release(entity.id); + _delEntBuffer[_delEntBufferCount++] = entity.id; _gens[entity.id] |= short.MinValue; _entitiesCount--; _entityDestry.OnEntityDestroy(entity); + + if(_delEntBufferCount >= _delEntBuffer.Length) + ReleaseDelEntBuffer(); + } + + private void ReleaseDelEntBuffer()//TODO проверить что буфер удаления работает нормально + { + for (int i = 0; i < _delEntBufferCount; i++) + _entityDispenser.Release(_delEntBuffer[i]); + _delEntBufferCount = 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Entities/ent.cs b/src/Entities/ent.cs index 87f5f80..76fd8e2 100644 --- a/src/Entities/ent.cs +++ b/src/Entities/ent.cs @@ -9,12 +9,12 @@ namespace DCFApixels.DragonECS [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 4)] public readonly ref struct ent { + [MarshalAs(UnmanagedType.I4)] internal readonly int id; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ent(int id) => this.id = id; - //public static explicit operator ent(int uniqueID) => new ent(uniqueID); - public static explicit operator int(ent entityID) => entityID.id; + public static implicit operator int(ent entityID) => entityID.id; public static bool operator ==(ent a, ent b) => a.id == b.id; public static bool operator !=(ent a, ent b) => a.id != b.id; @@ -27,6 +27,6 @@ namespace DCFApixels.DragonECS public struct Null { } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public EcsEntity ToStrong(IEcsWorld world) => world.GetEcsEntity(id); + public EcsEntity ToStrongID(IEcsWorld world) => world.GetEcsEntity(id); } }