| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | using System.Collections;using System.Collections.Generic;using UnityEngine;using System.Linq;using Unity.Jobs;using Unity.Collections;// using Unity.Entities;namespace GraphProcessor{	/// <summary>	/// Graph processor	/// </summary>	public class JobGraphProcessor : BaseGraphProcessor	{		GraphScheduleList[]			scheduleList;				internal class GraphScheduleList		{			public BaseNode			node;			public BaseNode[]		dependencies;				public GraphScheduleList(BaseNode node)			{				this.node = node;			}		}		/// <summary>		/// Manage graph scheduling and processing		/// </summary>		/// <param name="graph">Graph to be processed</param>		public JobGraphProcessor(BaseGraph graph) : base(graph) {}		public override void UpdateComputeOrder()		{			scheduleList = graph.nodes.OrderBy(n => n.computeOrder).Select(n => {				GraphScheduleList gsl = new GraphScheduleList(n);				gsl.dependencies = n.GetInputNodes().ToArray();				return gsl;			}).ToArray();		}		/// <summary>		/// Schedule the graph into the job system		/// </summary>		public override void Run()		{			int count = scheduleList.Length;			var scheduledHandles = new Dictionary< BaseNode, JobHandle >();			for (int i = 0; i < count; i++)			{				JobHandle dep = default(JobHandle);				var schedule = scheduleList[i];				int dependenciesCount = schedule.dependencies.Length;				for (int j = 0; j < dependenciesCount; j++)					dep = JobHandle.CombineDependencies(dep, scheduledHandles[schedule.dependencies[j]]);				// TODO: call the onSchedule on the current node				// JobHandle currentJob = schedule.node.OnSchedule(dep);				// scheduledHandles[schedule.node] = currentJob;			}			JobHandle.ScheduleBatchedJobs();		}	}}
 |