public static void Execute( ref JobEventReaderForEachStructParallel <TJob, T> fullData, IntPtr additionalPtr, IntPtr bufferRangePatchData, ref JobRanges ranges, int jobIndex) { while (true) { if (!JobsUtility.GetWorkStealingRange(ref ranges, jobIndex, out var begin, out var end)) { return; } for (int i = begin; i < end; i++) { fullData.JobData.Execute(fullData.Reader, i); } } }
/// <summary> Schedule a <see cref="IJobEventReaderForEach{T}"/> job. </summary> /// <param name="jobData"> The job. </param> /// <param name="eventSystem"> The event system. </param> /// <param name="dependsOn"> The job handle dependency. </param> /// <typeparam name="TJob"> The type of the job. </typeparam> /// <typeparam name="T"> The type of the key in the hash map. </typeparam> /// <returns> The handle to job. </returns> public static unsafe JobHandle ScheduleParallel <TJob, T>( this TJob jobData, EventSystemBase eventSystem, JobHandle dependsOn = default) where TJob : struct, IJobEventReaderForEach <T> where T : struct { dependsOn = eventSystem.GetEventReaders <T>(dependsOn, out var events); for (var i = 0; i < events.Count; i++) { var reader = events[i]; var fullData = new JobEventReaderForEachStructParallel <TJob, T> { Reader = reader, JobData = jobData, Index = i, }; #if UNITY_2020_2_OR_NEWER const ScheduleMode scheduleMode = ScheduleMode.Parallel; #else const ScheduleMode scheduleMode = ScheduleMode.Batched; #endif var scheduleParams = new JobsUtility.JobScheduleParameters( UnsafeUtility.AddressOf(ref fullData), JobEventReaderForEachStructParallel <TJob, T> .Initialize(), dependsOn, scheduleMode); dependsOn = JobsUtility.ScheduleParallelFor( ref scheduleParams, reader.ForEachCount, 1); } eventSystem.AddJobHandleForConsumer <T>(dependsOn); return(dependsOn); }