Unity 스크립팅 API 가이드 (2022.3)
이 문서는 Unity의 작업 시스템(Job System)에 대한 설명과 사용 예제를 제공하는 가이드입니다. 작업의 종속성과 실행 방법을 이해하는 데 도움이 될 것입니다.
작업 시스템의 개념
작업 시스템은 복잡한 계산을 관리하고 최적화하는 데 유용합니다. 여러 작업이 서로 의존할 수 있으며, 이러한 의존성은 작업이 어떻게 실행될지를 결정합니다.
작업의 종속성
- 작업 A는 작업 B가 사용하는
NativeArray
에 쓸 수 있습니다. - 종속성을 고려하여 작업 시스템에 작업을 예약해야 하며, 종속 작업이 완료될 때까지 대기합니다.
종속성의 특징 | 설명 |
---|---|
작업의 영향 | 하나의 작업이 여러 작업에 영향을 미칠 수 있습니다. |
실행 대기 시간 | 종속된 작업이 완료될 때까지 대기하므로 실행이 지연될 수 있습니다. |
JobHandle 사용 | JobHandle 을 사용하여 다른 작업에 대한 종속성을 설정할 수 있습니다. |
작업 예약
작업을 예약하면 JobHandle
이 반환되고, 이를 통해 다른 작업과의 종속성을 설정할 수 있습니다. 예를 들어, 작업 A의 JobHandle
을 작업 B에 전달하여 작업 A의 완료를 기다릴 수 있습니다.
코드 예시
다음은 두 개의 작업이 서로 종속된 사례입니다:
JobHandle firstJobHandle = firstJob.Schedule();
secondJob.Schedule(firstJobHandle);
종속성 병합
여러 작업이 있을 때 JobHandle.CombineDependencies
메서드를 사용하여 여러 종속성을 병합할 수 있습니다. 이 메서드는 여러 작업의 JobHandle
을 하나로 통합합니다.
사용 예시
NativeArray<JobHandle> handles = new NativeArray<JobHandle>(numJobs, Allocator.TempJob);
// Populate `handles` with `JobHandles` from multiple scheduled jobs...
JobHandle jh = JobHandle.CombineDependencies(handles);
다중 작업 예제
다음은 두 개의 종속된 작업을 구현하는 코드입니다. 각 작업은 독립적으로 설정되어 실행됩니다.
using UnityEngine;
using Unity.Collections;
using Unity.Jobs;
public class MyDependentJob : MonoBehaviour
{
NativeArray<float> result;
JobHandle secondHandle;
public struct MyJob : IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
result[0] = a + b;
}
}
public struct AddOneJob : IJob
{
public NativeArray<float> result;
public void Execute()
{
result[0] = result[0] + 1;
}
}
void Update()
{
result = new NativeArray<float>(1, Allocator.TempJob);
MyJob jobData = new MyJob
{
a = 10,
b = 10,
result = result
};
JobHandle firstHandle = jobData.Schedule();
AddOneJob incJobData = new AddOneJob
{
result = result
};
secondHandle = incJobData.Schedule(firstHandle);
}
private void LateUpdate()
{
secondHandle.Complete();
result.Dispose();
}
}
결론
이 문서는 Unity의 작업 시스템을 이해하고 사용하는 데 도움이 되는 기본 개념과 실제 예제를 포함했습니다. 작업의 종속성과 예약 방법을 잘 익혀서 효율적인 게임 개발에 응용하시기 바랍니다.