일반 Component System은 메인 스레드에서 돈다. 코어 수가 늘어나는 추세에 한 곳에서만 돌게 하는 것은 유용하지 않다. DOTS에 Job Component Systems (JCS)는Job들을Worker Thread에서 수행되도록 예약하는 일을 한다. (위 그림 참고)
// 예시
struct CopyFloatsJob : IJob
{
// Job에서 접근할 data를 모두 선언
// 안정성을 보장하기위해 읽기 전용 여부 선언
[ReadOnly]
public NativeArray<float> src;
public NativeArray<float> dst;
float deltaTime;
// Job에서 실행될 코드
public void Execute()
{
for(int i = 0; i < src.Length; i++)
dst[i] = src[i] * deltaTime;
}
}
var job = new CopyFloatsJob()
{
src = new NativeArray<float>(500, Allocator.Temp),
dst = new NativeArray<float>(500, Allocator.Temp),
deltaTime = Time.deltaTime
};
struct CopyFloatsJobFor : IJobParalleFor
{
// Job에서 접근할 data를 모두 선언
// 안정성을 보장하기위해 읽기 전용 여부 선언
[ReadOnly]
public NativeArray<float> src;
public NativeArray<float> dst;
// Job에서 실행될 코드
public void Execute(int index)
{
dst[index] = src[index];
}
}
var job = new CopyFloatsJobFor()
{
src = new NativeArray<float>(500, Allocator.Temp);
dst = new NativeArray<float>(500, Allocator.Temp);
};
// job을 예약할때 amount of foreach & batch size 를 입력할 수 있다
job.Schedule(500, 100);
한Job이 끝나고 다른 잡을Schedule할 수 있다
// src -> dst 카피하는 잡 스케줄
var src = new NativeArray<float>(500, Allocator.Temp);
var dst = new NativeArray<float>(500, Allocator.Temp);
var jobA = new CopyFloatJobFor() {src = src; dst = dst};
var jobAHandle = jobA.Schedule(src.Length, 100);
// dst -> finalDst 카피하는 잡 스케줄
var finalDst = new NativeArray<float>(500, Allocator.Temp);
var jobB = new CopyFloatJobFor() {src = dst, dst = finalDst};
// jobAHandle의 dependency로 jobB를 스케줄한다.
var jobBHandle = jobB.Schedule(src.Length, 100, jobAHandle);
jobBHandle.Complete();
최근댓글