public void EnableMultithreading () { #if !UNITY_WEBGL if (graphUpdateThread == null || !graphUpdateThread.IsAlive) { graphUpdateThread = new Thread (ProcessGraphUpdatesAsync); graphUpdateThread.IsBackground = true; // Set the thread priority for graph updates // Unless compiling for windows store or windows phone which does not support it #if !UNITY_WINRT graphUpdateThread.Priority = System.Threading.ThreadPriority.Lowest; #endif graphUpdateThread.Start (this); } #endif }
public PathProcessor (AstarPath astar, PathReturnQueue returnQueue, int processors, bool multithreaded) { this.astar = astar; this.returnQueue = returnQueue; if (processors < 0) { throw new System.ArgumentOutOfRangeException("processors"); } if (!multithreaded && processors != 1) { throw new System.Exception("Only a single non-multithreaded processor is allowed"); } // Set up path queue with the specified number of receivers queue = new ThreadControlQueue(processors); threadInfos = new PathThreadInfo[processors]; for (int i = 0; i < processors; i++) { threadInfos[i] = new PathThreadInfo(i, astar, new PathHandler(i, processors)); } if (multithreaded) { threads = new Thread[processors]; // Start lots of threads for (int i = 0; i < processors; i++) { var threadIndex = i; var thread = new Thread (() => CalculatePathsThreaded(threadInfos[threadIndex])); thread.Name = "Pathfinding Thread " + i; thread.IsBackground = true; threads[i] = thread; thread.Start(); } } else { // Start coroutine if not using multithreading threadCoroutine = CalculatePaths(threadInfos[0]); } }