● NativeContainer
▶ Unity에 Job 시스템은 멀티 스레드 사용 편하게 만들었지만, 일반적으로 Job의 데이터가 메인 스레드에서 접근할 수 없는 메모리에 만들어진다는 단점이 있다.
▶ 메인 스레드에서 Job의 데이터에 접근하기 위해서는 NativeContainer라는 특수한 공유 메모리 타입을 사용해야만 한다.
● NativeContainer Type
▶ NativeArray
: 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를 사용하면 메모리를 계속 잡고 있기 때문에 사용에 유의해야한다.
출처 : [Unity] Job 시스템 이해, NativeContainer - (2) (tistory.com)
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 화면 위치 > 월드 좌표 치환 RectTransformUtility (0) | 2023.02.05 |
---|---|
[Unity] UI 카메라 설정하기 (screen space - camera) (0) | 2023.01.15 |
[Unity] Job 시스템 이해 1, IJob (0) | 2023.01.15 |
[Unity] Serializable Dictionary - 인스펙터에 노출시킬 수 있는 딕셔너리 (0) | 2023.01.14 |
[Unity] onClick.AddListener에서 함수의 파라미터 전달 문제 (0) | 2023.01.14 |