한 잡이 다른 잡의 결과에 따라 달라지는 경우가 많습니다.예를 들어, 잡 A는 잡 B가 입력으로 사용하는 NativeArray
에 쓸 수 있습니다.종속 잡을 예약할 때 이러한 종속성에 대해 잡 시스템에 알려야 합니다.잡 시스템은 종속된 잡이 완료될 때까지 종속된 잡을 실행하지 않습니다.하나의 잡이 여러 잡에 영향을 미칠 수 있습니다.
각 잡이 이전 잡에 종속되는 작업 체인을 가질 수도 있습니다.그러나 종속성은 잡이 실행되기 전에 잡의 종속성이 완료될 때까지 기다려야 하므로 잡 실행을 지연시킵니다.종속 잡을 완료하려면 먼저 해당 잡이 종속된 모든 잡과 해당 잡이 종속되어 있는 모든 잡을 완료해야 합니다.
잡의 Schedule
메서드를 호출하면 JobHandle
이 반환됩니다.다른 잡에 대한 종속성으로 JobHandle
을 사용할 수 있습니다.한 잡이 다른 잡의 결과에 의존하는 경우, 다음과 같이 첫 번째 잡의 JobHandle
을 두 번째 잡의 Schedule
메서드에 파라미터로 전달할 수 있습니다.
JobHandle firstJobHandle = firstJob.Schedule();
secondJob.Schedule(firstJobHandle);
작업에 종속성이 많은 경우, JobHandle.CombineDependencies
메서드를 사용하여 종속성을 병합할 수 있습니다.CombineDependencies
를 사용하면 Schedule
메서드에 종속성을 전달할 수 있습니다.
NativeArray<JobHandle> handles = new NativeArray<JobHandle>(numJobs, Allocator.TempJob);
// Populate `handles` with `JobHandles` from multiple scheduled jobs...
JobHandle jh = JobHandle.CombineDependencies(handles);
다음은 여러 종속성이 있는 여러 잡의 예입니다.잡 코드(MyJob
및 AddOneJob
)를 Update
및 LateUpdate
코드와 별도의 파일에 넣는 것이 가장 좋지만, 명확성을 위해 이 예제에서는 다음과 같이 하나의 파일로 작성했습니다.
using UnityEngine;
using Unity.Collections;
using Unity.Jobs;
public class MyDependentJob :MonoBehaviour
{
// Create a native array of a single float to store the result.This example waits for the job to complete.
NativeArray<float> result;
// Create a JobHandle to access the results
JobHandle secondHandle;
// Set up the first job
public struct MyJob :IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
// Set up the second job, which adds one to a value
public struct AddOneJob :IJob
{
public NativeArray<float> result;
public void Execute()
{
result[0] = result[0] + 1;
}
}
// Update is called once per frame
void Update()
{
// Set up the job data for the first job
result = new NativeArray<float>(1, Allocator.TempJob);
MyJob jobData = new MyJob
{
a = 10,
b = 10,
result = result
};
// Schedule the first job
JobHandle firstHandle = jobData.Schedule();
// Setup the data for the second job
AddOneJob incJobData = new AddOneJob
{
result = result
};
// Schedule the second job
secondHandle = incJobData.Schedule(firstHandle);
}
private void LateUpdate()
{
// Sometime later in the frame, wait for the job to complete before accessing the results.
secondHandle.Complete();
// All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray
// float aPlusBPlusOne = result[0];
// Free the memory allocated by the result array
result.Dispose();
}
}
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.