@@ -281,7 +281,9 @@ public static StringBuilder AppendQueryMethod(this StringBuilder sb, ref QueryMe
281281 var getFirstElements = new StringBuilder ( ) . GetFirstElements ( queryMethod . Components ) ;
282282 var getComponents = new StringBuilder ( ) . GetComponents ( queryMethod . Components ) ;
283283 var insertParams = new StringBuilder ( ) . InsertParams ( queryMethod . Parameters ) ;
284-
284+ var jobParameters = new StringBuilder ( ) . JobParameters ( queryMethod . Parameters ) ;
285+ var jobParametersAssigment = new StringBuilder ( ) . JobParametersAssigment ( queryMethod . Parameters , queryMethod . IsStatic ) ;
286+
285287 var allTypeArray = new StringBuilder ( ) . GetTypeArray ( queryMethod . AllFilteredTypes ) ;
286288 var anyTypeArray = new StringBuilder ( ) . GetTypeArray ( queryMethod . AnyFilteredTypes ) ;
287289 var noneTypeArray = new StringBuilder ( ) . GetTypeArray ( queryMethod . NoneFilteredTypes ) ;
@@ -296,6 +298,7 @@ public static StringBuilder AppendQueryMethod(this StringBuilder sb, ref QueryMe
296298 using Arch.Core;
297299 using Arch.Core.Extensions;
298300 using Arch.Core.Utils;
301+ using Schedulers;
299302 using ArrayExtensions = CommunityToolkit.HighPerformance.ArrayExtensions;
300303 using Component = Arch.Core.Component;
301304 {{ ( ! queryMethod . IsGlobalNamespace ? $ "namespace { queryMethod . Namespace } {{" : "" ) }}
@@ -310,27 +313,44 @@ partial class {{queryMethod.ClassName}}{
310313
311314 private {{ staticModifier }} World? _{{ queryMethod . MethodName }} _Initialized;
312315 private {{ staticModifier }} Query? _{{ queryMethod . MethodName }} _Query;
313-
314- [MethodImpl(MethodImplOptions.AggressiveInlining)]
315- public {{ staticModifier }} void {{ queryMethod . MethodName }} Query(World world {{ data }} ){
316-
317- if(!ReferenceEquals(_{{ queryMethod . MethodName }} _Initialized, world)) {
318- _{{ queryMethod . MethodName }} _Query = world.Query(in {{ queryMethod . MethodName }} _QueryDescription);
319- _{{ queryMethod . MethodName }} _Initialized = world;
320- }
321-
322- foreach(ref var chunk in _{{ queryMethod . MethodName }} _Query){
323-
316+ private struct {{ queryMethod . MethodName }} QueryJobChunk : IJob
317+ {
318+ {{ jobParameters }}
319+ public {{ queryMethod . ClassName }} self;
320+ public void Execute() {
321+ foreach(ref var chunk in self._{{ queryMethod . MethodName }} _Query){
324322 {{ ( queryMethod . IsEntityQuery ? "ref var entityFirstElement = ref chunk.Entity(0);" : "" ) }}
325323 {{ getFirstElements }}
326-
324+
327325 foreach(var entityIndex in chunk)
328326 {
329327 {{ ( queryMethod . IsEntityQuery ? $ "ref readonly var { queryMethod . EntityParameter . Name . ToLower ( ) } = ref Unsafe.Add(ref entityFirstElement, entityIndex);" : "" ) }}
330328 {{ getComponents }}
331- {{ queryMethod . MethodName }} ({{ insertParams }} );
329+ {{ ( queryMethod . IsStatic ? "" : "self." ) }} {{ queryMethod . MethodName }} ({{ insertParams }} );
332330 }
333331 }
332+ }
333+ }
334+
335+ public {{ staticModifier }} void {{ queryMethod . MethodName }} Query(World world {{ data }} ){
336+
337+ if(!ReferenceEquals(_{{ queryMethod . MethodName }} _Initialized, world)) {
338+ _{{ queryMethod . MethodName }} _Query = world.Query(in {{ queryMethod . MethodName }} _QueryDescription);
339+ _{{ queryMethod . MethodName }} _Initialized = world;
340+ }
341+ var job = new {{ queryMethod . MethodName }} QueryJobChunk() { {{ jobParametersAssigment }} };
342+ job.Execute();
343+ }
344+
345+ public {{ staticModifier }} JobHandle {{ queryMethod . MethodName }} QueryAsync(World world {{ data }} ){
346+
347+ if(!ReferenceEquals(_{{ queryMethod . MethodName }} _Initialized, world)) {
348+ _{{ queryMethod . MethodName }} _Query = world.Query(in {{ queryMethod . MethodName }} _QueryDescription);
349+ _{{ queryMethod . MethodName }} _Initialized = world;
350+ }
351+ var job = new {{ queryMethod . MethodName }} QueryJobChunk() { {{ jobParametersAssigment }} };
352+ var handle = World.SharedJobScheduler.Schedule(job);
353+ return handle;
334354 }
335355 }
336356 {{ ( ! queryMethod . IsGlobalNamespace ? "}" : "" ) }}
0 commit comments