// Start is called before the first frame update void Start() { SimpleJob simpleJob = new SimpleJob { number = myNumber, data = myData, }; ParallelJob parallelJob = new ParallelJob { number = myNumber, data = myData, }; TransformJob transformJob = new TransformJob { number = myNumber, data = myData, deltaTime = Time.deltaTime, }; simpleJobHandle = simpleJob.Schedule(); parallelJobHandle = parallelJob.Schedule(myData.Length, 32, simpleJobHandle); transformJobHandle = transformJob.Schedule(transformAccessArray, parallelJobHandle); // dependency like a->b->c... JobHandle.ScheduleBatchedJobs(); simpleJobHandle.Complete(); parallelJobHandle.Complete(); transformJobHandle.Complete(); if (simpleJobHandle.IsCompleted) { Debug.Log("simple job result " + simpleJob.data[0]); } if (parallelJobHandle.IsCompleted) { for (int i = 0; i < myData.Length; ++i) { Debug.Log("parallel job result " + parallelJob.data[i]); } } myData.Dispose(); transformAccessArray.Dispose(); }
public void FindPrimesInAGeneratedSample() { results.text = ("\n Starting..."); //start a stopper to benchmark System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); NativeArray <int> input = new NativeArray <int>(inputSize, Allocator.TempJob); //store data how many prime numbers we found -> make an array element for each thread to avoid racing (multiple threads trying to write the same element can cause trouble) NativeArray <int> numberOfFoundPrimes = new NativeArray <int>(numberOfThreads, Allocator.TempJob); //initialize the sample for (int i = 0; i < inputSize; i++) { input[i] = UnityEngine.Random.Range(0, 10); } jobData = new ParallelJob(); jobData.input = input; jobData.nthreads = numberOfThreads; jobData.inputSize = inputSize; jobData.foundPrimes = numberOfFoundPrimes; //pass to scheduler - divide the input interval with the threads so we get (thread number) of chunks and we can calculate thread id's in the Execute method //(roughly the same as static scheduling) handle = jobData.Schedule(inputSize, inputSize / numberOfThreads); //waiting for all threads to finish handle.Complete(); //summarize the total prime numbers we found on each thread int totalFoundPrimes = 0; for (int i = 0; i < numberOfThreads; i++) { totalFoundPrimes += jobData.foundPrimes[i]; } //stop our stopper sw.Stop(); results.text += ("\n Done! Elapsed time: " + sw.ElapsedMilliseconds / 1000f + "\n Found: " + totalFoundPrimes); // disposal of nativearrays input.Dispose(); numberOfFoundPrimes.Dispose(); }
private void RunDemo() { ParallelJob parallelJob = new ParallelJob { Number = m_MyNumber, Data = m_MyData }; m_ParallelJobHandle = parallelJob.Schedule(m_MyData.Length, 32); JobHandle.ScheduleBatchedJobs(); m_ParallelJobHandle.Complete(); if (m_ParallelJobHandle.IsCompleted) { for (int i = 0; i < m_MyData.Length; i++) { Debug.Log(parallelJob.Data[i]); } FreeMemoryData(); } }
private void runDemo() { ParallelJob parallelJob = new ParallelJob { number = myNumber, data = myData }; myParallelJobHandle = parallelJob.Schedule(myData.Length, 32); JobHandle.ScheduleBatchedJobs(); myParallelJobHandle.Complete(); if (myParallelJobHandle.IsCompleted) { for (int i = 0; i < myData.Length; i++) { Debug.Log(parallelJob.data[i]); } freeMemoryData(); } }
// Update is called once per frame void Update() { if (useThread) { ParallelJob tempParallelJob = new ParallelJob() { deltaTime = Time.deltaTime }; NativeArray <float3> eulerAngles = new NativeArray <float3>(goList.Count, Allocator.TempJob); for (int i = 0; i < goList.Count; ++i) { eulerAngles[i] = goList[i].transform.eulerAngles; } tempParallelJob.eulerAngles = eulerAngles; JobHandle jobHandle = tempParallelJob.Schedule(goList.Count, 10); jobHandle.Complete(); for (int i = 0; i < goList.Count; ++i) { goList[i].transform.eulerAngles = eulerAngles[i]; } eulerAngles.Dispose(); } else { foreach (var item in goList) { item.transform.eulerAngles += new Vector3(0, 30 * Time.deltaTime, 0); for (int i = 0; i < 1000; ++i) { float result = math.exp10(math.sqrt(5 * 6)); } } } }
// Start is called before the first frame update void Start() { ParallelJob parallelJob = new ParallelJob { number = myNumber, data = myData, }; parallelJobHandle = parallelJob.Schedule(myData.Length, 32); JobHandle.ScheduleBatchedJobs(); parallelJobHandle.Complete(); if (parallelJobHandle.IsCompleted) { for (int i = 0; i < myData.Length; ++i) { Debug.Log(parallelJob.data[i]); } } myData.Dispose(); }