[Unity] Job 시스템 이해, IJobParallelFor- (4)
※ JobHandle을 보기 전, Job 시스템의 이해가 필요하다면 하단의 게시물을 참고
https://everyday-devup.tistory.com/97
● Interface IJobParallelFor
▶ IJob이 단일 워커 스레드에서 Execute()가 한번 처리되었다면, IJobParallerFor는 사용 가능한 모든 워커 스레드에서 Execute()가 실행 횟수 만큼 나뉘어서 실행된다.
▶ IJobParallelFor는 Execute()의 로직은 동일하지만 특정 Index의 매개 변수가 다를 때 사용하면 유용하다. 같은 로직을 여러번 수행할 때 묶음으로 처리함으로써 성능 향상의 도움이 된다.
[JobProducerType( typeof( IJobParallelForExtensions.ParallelForJobStruct<> ) )]
public interface IJobParallelFor
{
//
// 요약:
// Implement this method to perform work against a specific iteration index.
//
// 매개 변수:
// index:
// The index of the Parallel for loop at which to perform work.
void Execute(int index);
}
▶ IJob과 달리 Execute에 Index가 추가되었는데, 해당 Index로 Job의 데이터 리스트에서 가져올 데이터를 확인할 수 있다.
using UnityEngine;
using Unity.Jobs;
using Unity.Collections;
public class JobSample : MonoBehaviour
{
/// <summary>
/// Excute의 Index를 result 배열에 넣어주는 단순한 예제
/// </summary>
struct JobParallel : IJobParallelFor
{
public NativeArray<int> result;
public void Execute(int index)
{
result[index] = index;
}
}
// Job을 실행할 횟수
int count = 10000;
// 하나의 워커 스레드당 설정할 Job의 개수
// 워커스레드가 3개인 경우 10000개의 Job을 10개씩 나누어 3개의 워커 스레드에 나눈다.
// 10000/10 = 1000, 1000/3 = 333 개 묶음으로 나뉨
int batchCount = 10;
void Start()
{
NativeArray<int> result = new NativeArray<int>( count, Allocator.TempJob );
JobParallel jobParallel = new JobParallel();
jobParallel.result = result;
// count, batchCount에 따라 워커 스레드에 Job이 나뉘게 된다.
JobHandle handle = jobParallel.Schedule( count, batchCount );
handle.Complete();
result.Dispose();
}
}
▶ IJob이 한번에 여러개의 워커 스레드에서 실행된다는 것 외에는 기본적인 개념은 IJob과 동일하다.
▶ IJobParallelFor를 확장하여, 한번에 여러개의 Transform을 처리하는 Job을 만들 수 있는 IJobParallelForTransform도 있다. IJobParallelForTransform를 사용하려면 using UnityEngine.Jobs 을 선언해야한다.
▶ PackageManager에서 Jobs Preview Package를 Import하면 IJobParallelFor의 확장형 인터페이스를 추가로 사용할 수 있다.
: PreviewPackage이기 때문에 해당 확장형 인터페이스를 사용하기 보다는 기존의 IJobParallelFor를 사용하는 것이 현재로써는 더 좋다.
※ 참고 자료