refactoring

This commit is contained in:
Mikhail 2023-05-27 15:59:46 +08:00
parent 8f8571a646
commit 1b8cf0f0e9
6 changed files with 61 additions and 70 deletions

View File

@ -4,9 +4,6 @@ using System.Linq;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
//TODO развить идею инжектов
//добавить контейнер, который автоматически создается, собирает в себя все пре-инжекты и авто-инжектится во все системы.
//но это спорная идея
public interface IEcsPreInject : IEcsSystem public interface IEcsPreInject : IEcsSystem
{ {
void PreInject(object obj); void PreInject(object obj);

View File

@ -36,7 +36,14 @@ namespace DCFApixels.DragonECS
public static void Set(DebugService service) => DebugService.Set(service); public static void Set(DebugService service) => DebugService.Set(service);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Print(object v) => DebugService.Instance.Print(v); public static void PrintWarning(object v) => Print(EcsConsts.DEBUG_WARNING_TAG, v);
public static void PrintError(object v) => Print(EcsConsts.DEBUG_ERROR_TAG, v);
public static void Print(object v)
{
#if !DISABLE_DRAGONECS_DEBUGGER
DebugService.Instance.Print(v);
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Print(string tag, object v) public static void Print(string tag, object v)
{ {

View File

@ -219,12 +219,11 @@ namespace DCFApixels.DragonECS
} }
#endregion #endregion
#region Sort/Clear #region Clear
//public void Sort() { } //TODO прошлай реализация сортировки не удачная, так как в dense могут храниться занчения больше чем dense.Length
public void Clear() public void Clear()
{ {
_count = 0; _count = 0;
//массив _dense нет смысла очищать, испольщуется только область от 1 до _count //массив _dense нет смысла очищать
for (int i = 0; i < _sparse.Length; i++) for (int i = 0; i < _sparse.Length; i++)
_sparse[i] = 0; _sparse[i] = 0;
} }

View File

@ -26,9 +26,6 @@ namespace DCFApixels.DragonECS
private short[] _componentCounts; private short[] _componentCounts;
private EcsGroup _allEntites; private EcsGroup _allEntites;
//буфер удаления откладывает освобождение андишников сущностей.
//Нужен для того чтобы запускать некоторые процесыы связанные с удалением сущности не по одному при каждом удалении, а пачкой
//В теории такой подход частично улучшает ситуацию с переполнением поколений
private int[] _delEntBuffer; private int[] _delEntBuffer;
private int _delEntBufferCount; private int _delEntBufferCount;
@ -138,7 +135,6 @@ namespace DCFApixels.DragonECS
_pools[uniqueID] = pool; _pools[uniqueID] = pool;
pool.OnInit(this, uniqueID); pool.OnInit(this, uniqueID);
_poolsCount++; _poolsCount++;
//EcsDebug.Print(pool.GetType().FullName);
} }
return (TPool)_pools[uniqueID]; return (TPool)_pools[uniqueID];
@ -158,39 +154,39 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Queries #region Queries
public TExecutor GetExecutor<TExecutor>(Func<EcsWorld, TExecutor> builder) where TExecutor: EcsQueryExecutor public TExecutor GetExecutor<TExecutor>() where TExecutor : EcsQueryExecutor, new()
{ {
int id = WorldMetaStorage.GetExecutorId<TExecutor>(_worldTypeID); int id = WorldMetaStorage.GetExecutorId<TExecutor>(_worldTypeID);
if (id >= _executors.Length) if (id >= _executors.Length)
Array.Resize(ref _executors, _executors.Length << 1); Array.Resize(ref _executors, _executors.Length << 1);
if (_executors[id] == null) if (_executors[id] == null)
_executors[id] = builder(this); {
var executor = new TExecutor();
executor.Initialize(this);
_executors[id] = executor;
}
return (TExecutor)_executors[id]; return (TExecutor)_executors[id];
} }
private EcsWhereExecutor<TSubject> EcsWhereExecutorBuilder<TSubject>(EcsWorld world) where TSubject : EcsSubject
{
return new EcsWhereExecutor<TSubject>(world.GetSubject<TSubject>());
}
public EcsWhereResult<TSubject> WhereFor<TSubject>(EcsReadonlyGroup sourceGroup, out TSubject subject) where TSubject : EcsSubject public EcsWhereResult<TSubject> WhereFor<TSubject>(EcsReadonlyGroup sourceGroup, out TSubject subject) where TSubject : EcsSubject
{ {
var executor = GetExecutor(EcsWhereExecutorBuilder<TSubject>); var executor = GetExecutor<EcsWhereExecutor<TSubject>>();
subject = executor.Subject; subject = executor.Subject;
return executor.ExecuteFor(sourceGroup); return executor.ExecuteFor(sourceGroup);
} }
public EcsWhereResult<TSubject> WhereFor<TSubject>(EcsReadonlyGroup sourceGroup) where TSubject : EcsSubject public EcsWhereResult<TSubject> WhereFor<TSubject>(EcsReadonlyGroup sourceGroup) where TSubject : EcsSubject
{ {
return GetExecutor(EcsWhereExecutorBuilder<TSubject>).ExecuteFor(sourceGroup); return GetExecutor<EcsWhereExecutor<TSubject>>().ExecuteFor(sourceGroup);
} }
public EcsWhereResult<TSubject> Where<TSubject>(out TSubject subject) where TSubject : EcsSubject public EcsWhereResult<TSubject> Where<TSubject>(out TSubject subject) where TSubject : EcsSubject
{ {
var executor = GetExecutor(EcsWhereExecutorBuilder<TSubject>); var executor = GetExecutor<EcsWhereExecutor<TSubject>>();
subject = executor.Subject; subject = executor.Subject;
return executor.Execute(); return executor.Execute();
} }
public EcsWhereResult<TSubject> Where<TSubject>() where TSubject : EcsSubject public EcsWhereResult<TSubject> Where<TSubject>() where TSubject : EcsSubject
{ {
return GetExecutor(EcsWhereExecutorBuilder<TSubject>).Execute(); return GetExecutor<EcsWhereExecutor<TSubject>>().Execute();
} }
#endregion #endregion
@ -369,40 +365,6 @@ namespace DCFApixels.DragonECS
break; break;
} }
} }
// public int GetComponents(int entity, ref object[] list)
// {
// var entityOffset = GetRawEntityOffset(entity);
// var itemsCount = _entities[entityOffset + RawEntityOffsets.ComponentsCount];
// if (itemsCount == 0) { return 0; }
// if (list == null || list.Length < itemsCount)
// {
// list = new object[_pools.Length];
// }
// var dataOffset = entityOffset + RawEntityOffsets.Components;
// for (var i = 0; i < itemsCount; i++)
// {
// list[i] = _pools[_entities[dataOffset + i]].GetRaw(entity);
// }
// return itemsCount;
// }
// public int GetComponentTypes(int entity, ref Type[] list)
// {
// var entityOffset = GetRawEntityOffset(entity);
// var itemsCount = _entities[entityOffset + RawEntityOffsets.ComponentsCount];
// if (itemsCount == 0) { return 0; }
// if (list == null || list.Length < itemsCount)
// {
// list = new Type[_pools.Length];
// }
// var dataOffset = entityOffset + RawEntityOffsets.Components;
// for (var i = 0; i < itemsCount; i++)
// {
// list[i] = _pools[_entities[dataOffset + i]].GetComponentType();
// }
// return itemsCount;
// }
#endregion #endregion
} }

View File

@ -2,6 +2,14 @@
{ {
public abstract class EcsQueryExecutor public abstract class EcsQueryExecutor
{ {
private EcsWorld _world;
public EcsWorld World => _world;
internal void Initialize(EcsWorld world)
{
_world = world;
OnInitialize();
}
protected abstract void OnInitialize();
internal void Destroy() => OnDestroy(); internal void Destroy() => OnDestroy();
protected abstract void OnDestroy(); protected abstract void OnDestroy();
} }

View File

@ -1,26 +1,28 @@
using Unity.Profiling; namespace DCFApixels.DragonECS
namespace DCFApixels.DragonECS
{ {
public sealed class EcsWhereExecutor<TSubject> : EcsQueryExecutor where TSubject : EcsSubject public sealed class EcsWhereExecutor<TSubject> : EcsQueryExecutor where TSubject : EcsSubject
{ {
private readonly TSubject _subject; private TSubject _subject;
private readonly EcsGroup _filteredGroup; private EcsGroup _filteredGroup;
private long _executeVersion; private long _executeVersion;
private ProfilerMarker _executeWhere = new ProfilerMarker("JoinAttachQuery.Where"); private EcsProfilerMarker _executeWhere = new EcsProfilerMarker("Where");
#region Properties #region Properties
public TSubject Subject => _subject; public TSubject Subject => _subject;
internal long ExecuteVersion => _executeVersion; internal long ExecuteVersion => _executeVersion;
#endregion #endregion
#region Constructors #region OnInitialize/OnDestroy
public EcsWhereExecutor(TSubject subject) protected sealed override void OnInitialize()
{ {
_subject = subject; _subject = World.GetSubject<TSubject>();
_filteredGroup = EcsGroup.New(subject.World); _filteredGroup = EcsGroup.New(World);
}
protected sealed override void OnDestroy()
{
_filteredGroup.Release();
} }
#endregion #endregion
@ -33,14 +35,30 @@ namespace DCFApixels.DragonECS
#if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (sourceGroup.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения. if (sourceGroup.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения.
#endif #endif
_subject.GetIteratorFor(sourceGroup).CopyTo(_filteredGroup); //_subject.GetIteratorFor(sourceGroup).CopyTo(_filteredGroup);
var pools = _subject.World._pools;
var mask = _subject.Mask;
_filteredGroup.Clear();
foreach (var e in sourceGroup)
{
for (int i = 0, iMax = mask._inc.Length; i < iMax; i++)
{
if (!pools[mask._inc[i]].Has(e))
goto next;
}
for (int i = 0, iMax = mask._exc.Length; i < iMax; i++)
{
if (pools[mask._exc[i]].Has(e))
goto next;
}
_filteredGroup.AddInternal(e);
next: continue;
}
return new EcsWhereResult<TSubject>(this, _filteredGroup.Readonly); return new EcsWhereResult<TSubject>(this, _filteredGroup.Readonly);
} }
} }
protected sealed override void OnDestroy()
{
_filteredGroup.Release();
}
#endregion #endregion
} }