Ejemplo n.º 1
0
        /// <summary> Schedule a <see cref="IJobEventReader{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 Schedule <TJob, T>(
            this TJob jobData, EventSystemBase eventSystem, JobHandle dependsOn = default)
            where TJob : struct, IJobEventReader <T>
            where T : struct
        {
            dependsOn = eventSystem.GetEventReaders <T>(dependsOn, out var events);

            for (var i = 0; i < events.Count; i++)
            {
                var fullData = new EventJobReaderStruct <TJob, T>
                {
                    Reader  = events[i],
                    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),
                    EventJobReaderStruct <TJob, T> .Initialize(),
                    dependsOn,
                    scheduleMode);

                dependsOn = JobsUtility.Schedule(ref scheduleParams);
            }

            eventSystem.AddJobHandleForConsumer <T>(dependsOn);

            return(dependsOn);
        }
Ejemplo n.º 2
0
 /// <summary> Schedule a <see cref="IJobEvent{T}"/> job. </summary>
 /// <param name="jobData"> The job. </param>
 /// <param name="eventSystem"> The event system. </param>
 /// <param name="dependsOn"> T he 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 JobHandle ScheduleParallel <TJob, T>(
     this TJob jobData,
     EventSystemBase eventSystem,
     JobHandle dependsOn = default)
     where TJob : struct, IJobEvent <T>
     where T : struct
 {
     return(ScheduleInternal <TJob, T>(jobData, eventSystem, dependsOn, true));
 }
Ejemplo n.º 3
0
        private static unsafe JobHandle ScheduleInternal <TJob, T>(
            this TJob jobData,
            EventSystemBase eventSystem,
            JobHandle dependsOn,
            bool isParallel)
            where TJob : struct, IJobEvent <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 JobEventProducer <TJob, T>
                {
                    Reader     = reader,
                    JobData    = jobData,
                    IsParallel = isParallel,
                };

#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),
                    isParallel ? JobEventProducer <TJob, T> .InitializeParallel() : JobEventProducer <TJob, T> .InitializeSingle(),
                    dependsOn,
                    scheduleMode);

                dependsOn = isParallel
                    ? JobsUtility.ScheduleParallelFor(ref scheduleParams, reader.ForEachCount, 1)
                    : JobsUtility.Schedule(ref scheduleParams);
            }

            eventSystem.AddJobHandleForConsumer <T>(dependsOn);

            return(dependsOn);
        }