EveryDay.DevUp

[Unity] Job 시스템 이해, NativeContainer - (2) 본문

DotsTween

[Unity] Job 시스템 이해, NativeContainer - (2)

EveryDay.DevUp 2020. 7. 15. 20:34

※ NativeContainer를 보기 전, Job 시스템의 이해가 필요하다면 하단의 게시물을 참고

https://everyday-devup.tistory.com/97

 

[Unity] Job 시스템 이해, IJob - (1)

● Unity의 Job 시스템에 대한 이해가 필요하다면, 다음의 게시물을 참고 https://everyday-devup.tistory.com/69 [Unity] DOTS - 프로세스, 스레드, C# Job 시스템 ECS를 알아보기 전 DOTS에 대해 궁금한 점이..

everyday-devup.tistory.com

● NativeContainer

▶ Unity에 Job 시스템은 멀티 스레드 사용 편하게 만들었지만, 일반적으로 Job의 데이터가 메인 스레드에서 접근할 수 없는 메모리에 만들어진다는 단점이 있다.

▶ 메인 스레드에서 Job의 데이터에 접근하기 위해서는 NativeContainer라는 특수한 공유 메모리 타입을 사용해야만 한다.

● NativeContainer Type

▶ NatvieArray

: Unity에 내장된 기본적인 Job 시스템에서 사용하는 NativeContainer Type으로 Array와 유사하다.

※ 하단의 NativeContainer Type은 ECS에서 제공하는 NativeContainer Type으로 Package Manager를 통해 Collections을 Import해야지만 사용이 가능하다.

▶ NativeList

: 크기 변경이 가능한 NativeArray, List와 유사하다.

▶ NativeHashMap 

: Dictinary와 유사하지만, 키와 값이 1:1로 매핑된다.

▶ NativeMultiHashMap

: Dictinary와 유사하지만, 키와 값이 1:N로 매핑된다.

▶ NativeQueue

: Queue와 유사하다.

● NativeContainer 속성

 NativeContainer는 기본적으로 읽기/쓰기가 가능하지만, 최적화를 위해서 읽기/쓰기 권한을 별도로 설정할 수 있다

: [ReadOnly]를 NativeContainer에 설정하면 메모리에서 읽기만 가능하며, 이 경우 다른 Job에서도 해당 NativeContainer에 접근할 수 있다.

[ReadOnly]
public NativeArray<int> result;

: [WriteOnly]를 NativeContainer에 설정하면 메모리에 쓰기만 가능하다. 이 경우 Job에서 해당 NativeContainer에 쓰기 작업을 하고 있다면, 다른 Job에게 쓰기 권한을 주지 않는다.

[WriteOnly]
public NativeArray<int> result;

: NativeContainer의 사용 용도에 따라 속성을 잘 설정하면 Job의 성능을 더 올릴 수 있다.

● NativeContainer 할당

: NativeContainer을 New로 할당할 때, Memory가 유지되는 시간을 설정할 수 있다.

▶ Allocator.Temp

new NativeArray<int>( 1, Allocator.Temp );

: 가장 빠른 할당에 사용되지만, 수명이 1프레임 이하 작업에 적합하다. 

void Start()
{
	JobSigle jobSigle = new JobSigle();
	jobSigle.a = 1;
	jobSigle.b = 2;
	jobSigle.result = new NativeArray<int>( 1, Allocator.TempJob );
	JobHandle handle = jobSigle.Schedule();
	handle.Complete();
	jobSigle.result.Dispose();
}

: 하나의 함수 안에서 Job을 생성하고, 해당 Job의 실행이 끝나기 전까지 메인 스레드에서 기다리게 하는 작업에 적합하다.

▶ Allocator.TempJob

jobSigle.result = new NativeArray<int>( 1, Allocator.TempJob );

: Temp 보다는 느리지만, Persistent보다는 빠른 할당으로 수명이 4프레임 이하일 때 적합하다.

: Job을 Schedule()로 등록하고 해당 Job이 끝날 때까지 대기하지 않으면서 4프레임 안에 해당 Job이 끝날 때 사용해야한다.

▶ Allocator.Persistent

jobSigle.result = new NativeArray<int>( 1, Allocator.Persistent );

: 가장 느린 할당이지만, 지속적으로 메모리가 유지된다. 

: Persistent를 사용하면 메모리를 계속 잡고 있기 때문에 사용에 유의해야한다.

※ 후속 게시물

https://everyday-devup.tistory.com/99

 

[Unity] Job 시스템 이해, JobHandle - (3)

※ JobHandle을 보기 전, Job 시스템의 이해가 필요하다면 하단의 게시물을 참고 https://everyday-devup.tistory.com/97 [Unity] Job 시스템 이해, IJob - (1) ● Unity의 Job 시스템에 대한 이해가 필요하다면,..

everyday-devup.tistory.com

 참고 자료 

https://docs.unity3d.com/kr/current/Manual/JobSystem.html