Unity 스크립팅 API 가이드 (2022.3 LTS)
이 문서에서는 Unity의 잡 시스템 및 네이티브 컨테이너에 대한 개요를 제공합니다. 특히, 스레드 안전 타입과 커스텀 네이티브 컨테이너를 구현하는 방법에 대해 설명합니다. 이 정보는 Unity의 성능을 최적화하는 데 유용합니다.
1. 잡 시스템 개요
잡 시스템은 멀티스레딩 환경에서 고성능을 유지할 수 있게 도와줍니다. 이를 통해 여러 개의 고립된 작업을 동시에 실행할 수 있으며, 스레드 간의 충돌 가능성을 줄입니다.
2. 네이티브 컨테이너란?
네이티브 컨테이너는 관리되지 않는 메모리에 데이터를 저장하고, 이를 안전하게 처리할 수 있도록 도와주는 데이터를 저장하는 컨테이너입니다.
2.1. 네이티브 컨테이너 타입
Unity의 Unity.Collections
네임스페이스에는 여러 유형의 네이티브 컨테이너가 포함되어 있습니다:
네이티브 컨테이너 | 설명 |
---|---|
NativeArray | 관리되는 코드에 네이티브 메모리 버퍼를 노출하는 관리되지 않는 배열 |
NativeSlice | 특정 위치에서 특정 길이까지 NativeArray의 하위 세트를 가져옴 |
참고: 컬렉션 패키지에는 추가 네이티브 컨테이너 항목이 포함되어 있습니다.
3. 읽기 및 쓰기 액세스
잡 시스템에서 네이티브 컨테이너에 기본적으로 읽기 및 쓰기 액세스 권한을 갖습니다. 그러나 성능 저하를 초래할 수 있으므로, 혹시 나쁜 영향을 미칠 경우 [ReadOnly] 속성을 사용하는 것이 좋습니다.
예제 코드
[ReadOnly]
public NativeArray<int> input;
위 예제에서는 다른 잡과 동시에 읽기 전용으로 액세스할 수 있습니다.
4. 메모리 할당자
네이티브 컨테이너를 생성할 때 메모리 할당 타입을 지정해야 합니다. 각 할당 타입은 사용 가능한 메모리의 수명에 따라 다릅니다.
할당자 타입 | 설명 |
---|---|
Allocator.Temp | 가장 빠른 할당, 수명이 한 프레임 이하 |
Allocator.TempJob | 수명이 4프레임 내에서 스레드 세이프 할당 |
Allocator.Persistent | 애플리케이션 수명 동안 유지 가능한 할당 |
예제 코드
NativeArray<float> result = new NativeArray<float>(1, Allocator.TempJob);
5. 안전 시스템
모든 네이티브 컨테이너 인스턴스에는 안전 시스템이 내장되어 있습니다. 이는 여러 잡이 동일한 데이터에 동시에 읽기 및 쓰기를 시도할 때 오류를 방지합니다.
쓰기 안전성
쓰기 잡이 완료되기 전에 해당 내용을 읽으려 한다면 오류가 발생합니다. 또한, 이미 실행 중인 잡의 결과를 바꾸는 것도 불가능합니다.
예제 코드
MyStruct temp = myNativeArray[i];
temp.memberVariable = 0;
myNativeArray[i] = temp;
6. 추가 리소스
- 커스텀 네이티브 컨테이너 구현
- Unity 커뮤니티 포럼 및 기술 자료
이 문서는 Unity 잡 시스템을 효과적으로 사용하는 데 필요한 기본적인 이해를 돕기 위해 작성되었습니다. 추가 정보는 공식 문서를 참조하길 바랍니다.