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

View File

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

View File

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

View File

@ -15,7 +15,7 @@ namespace DCFApixels.DragonECS
#region Methods #region Methods
public EcsPool<T> GetPool<T>() where T : struct; public EcsPool<T> GetPool<T>() where T : struct;
public ReadOnlySpan<EcsPool> GetAllPools(); 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 int GetComponentID<T>();
public bool IsMaskCompatible<TInc, TExc>(int entityID) where TInc : struct, IInc where TExc : struct, IExc; public bool IsMaskCompatible<TInc, TExc>(int entityID) where TInc : struct, IInc where TExc : struct, IExc;