simplifying EcsQuery

This commit is contained in:
Mikhail 2023-04-12 23:09:50 +08:00
parent d7988166dd
commit 6d357fc948
4 changed files with 13 additions and 17 deletions

View File

@ -8,16 +8,12 @@ using UnityEngine.UI;
namespace DCFApixels.DragonECS
{
public abstract class EcsQueryBase
public abstract class EcsQuery
{
internal EcsGroup groupFilter;
internal EcsQueryMask mask;
public IEcsWorld World => groupFilter.World;
}
public abstract class EcsQuery<TWorldArchetype> : EcsQueryBase
where TWorldArchetype : EcsWorld<TWorldArchetype>
{
private ProfilerMarker _getEnumerator = new ProfilerMarker("EcsQuery.GetEnumerator");
public EcsGroup.Enumerator GetEnumerator()
@ -71,20 +67,20 @@ namespace DCFApixels.DragonECS
private List<int> _inc;
private List<int> _exc;
internal static TQuery Build<TQuery>(IEcsWorld world) where TQuery : EcsQueryBase
internal static TQuery Build<TQuery>(IEcsWorld world) where TQuery : EcsQuery
{
Builder builder = new Builder(world);
Type queryType = typeof(TQuery);
ConstructorInfo constructorInfo = queryType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(Builder) }, null);
EcsQuery<TWorldArchetype> newQuery;
EcsQuery newQuery;
if (constructorInfo != null)
{
newQuery = (EcsQuery<TWorldArchetype>)constructorInfo.Invoke(new object[] { builder });
newQuery = (EcsQuery)constructorInfo.Invoke(new object[] { builder });
}
else
{
newQuery = (EcsQuery<TWorldArchetype>)Activator.CreateInstance(typeof(TQuery));
newQuery = (EcsQuery)Activator.CreateInstance(typeof(TQuery));
newQuery.Init(builder);
}

View File

@ -17,10 +17,10 @@ namespace DCFApixels.DragonECS
private int _entitiesCount;
private List<EcsQueryBase>[] _filtersByIncludedComponents;
private List<EcsQueryBase>[] _filtersByExcludedComponents;
private List<EcsQuery>[] _filtersByIncludedComponents;
private List<EcsQuery>[] _filtersByExcludedComponents;
private EcsQueryBase[] _queries;
private EcsQuery[] _queries;
private List<EcsGroup> _groups;

View File

@ -74,7 +74,7 @@ namespace DCFApixels.DragonECS
private EcsPool[] _pools;
private EcsNullPool _nullPool;
private EcsQueryBase[] _queries;
private EcsQuery[] _queries;
private EcsPipeline _pipeline;
@ -142,7 +142,7 @@ namespace DCFApixels.DragonECS
ArrayUtility.Fill(_pools, _nullPool);
_gens = new short[512];
_queries = new EcsQuery<TWorldArchetype>[QueryType.capacity];
_queries = new EcsQuery[QueryType.capacity];
_groups = new List<EcsGroup>(128);
_denseEntities = new int[512];
@ -181,7 +181,7 @@ namespace DCFApixels.DragonECS
#endregion
#region Query
public TQuery Query<TQuery>(out TQuery query) where TQuery : EcsQueryBase
public TQuery Query<TQuery>(out TQuery query) where TQuery : EcsQuery
{
int uniqueID = QueryType<TQuery>.uniqueID;
if (_queries.Length < QueryType.capacity)
@ -189,7 +189,7 @@ namespace DCFApixels.DragonECS
if (_queries[uniqueID] == null)
{
_queries[uniqueID] = EcsQuery<TWorldArchetype>.Builder.Build<TQuery>(this);
_queries[uniqueID] = EcsQuery.Builder.Build<TQuery>(this);
}
query = (TQuery)_queries[uniqueID];
return query;

View File

@ -15,7 +15,7 @@ namespace DCFApixels.DragonECS
#region Methods
public EcsPool<T> GetPool<T>() where T : struct;
public ReadOnlySpan<EcsPool> GetAllPools();
public TQuery Query<TQuery>(out TQuery query) where TQuery : EcsQueryBase;
public TQuery Query<TQuery>(out TQuery query) where TQuery : EcsQuery;
public int GetComponentID<T>();
public bool IsMaskCompatible<TInc, TExc>(int entityID) where TInc : struct, IInc where TExc : struct, IExc;