한 잡이 다른 잡의 결과에 따라 달라지는 경우가 많습니다.예를 들어, 잡 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();
}
}