Unity 매뉴얼: NativeContainer 구조체 복사
개요
NativeContainer는 유니티에서 데이터 저장 및 관리를 위한 매우 효과적인 방법입니다. 특히, NativeContainer는 멀티스레딩 안전성과 같은 중요한 기능을 제공합니다. 이 문서에서는 NativeContainer의 작동 방식과 커스텀 NativeContainer 구현에 대해 설명합니다.
NativeContainer 구조체 복사
NativeContainer는 값 타입으로, 변수에 할당할 때 데이터가 저장된 위치에 대한 포인터를 포함하는 NativeContainer 구조체가 복사됩니다. 내용 전체를 복사하는 것이 아니라, 이것은 동일한 메모리 영역을 참조하게 됩니다. 즉, 여러 개의 NativeContainer 사본이 동일한 사실상의 컨테이너를 참조할 수 있습니다.
NativeContainer 개체 사본의 동작方式
- NativeContainer의 사본은 동일한 데이터를 가리키며, 서로 다른 플래그를 가집니다.
- AtomicSafetyHandle은 안전 데이터에 대한 포인터와 플래그로 구성됩니다.
사본 1 | 사본 2 | 사본 3 | 메모리 위치 | 데이터 |
----- | ------ | ----- | ------ | ------ |
동일한 실체 참조 | 동일한 실체 참조 | 동일한 실체 참조 | 동일한 데이터 | 동일한 원본 |
폐기 및 무효화
NativeContainer의 폐기 시, 모든 사본은 원본이 무효화되었음을 인식해야 합니다. 이 경우, 사본의 저장 데이터 포인터는 더 이상 유효하지 않으며 액세스 위반이 발생할 수 있습니다.
동적 NativeContainer의 정적 뷰
동적 NativeContainer는 가변 크기를 가지며 사용 중에 요소를 추가할 수 있습니다. 여기에 대한 예제와 함께 설명하겠습니다.
뷰의 예
- NativeList와 같은 동적 네이티브 컨테이너에서 사용할 수 있는 열거자
- NativeList.AsArray 메서드를 활용하여 NativeArray처럼 사용할 수 있습니다.
동적 컨테이너 예시 | 정적 컨테이너 예시 |
--------------------- | --------------------- |
NativeList |
NativeArray |
요소 추가 가능 | 고정 크기 |
보조 버전 번호
AtomicSafetyHandle에 보조 버전 번호를 포함하여 동적 NativeContainer의 크기 변경을 안전하게 관리할 수 있습니다. 주 버전 번호와 독립적으로 증분되며, 새로운 뷰를 구성할 때 사용됩니다.
메서드 | 설명 | |||
------ | --------- | ---------- | -------- | --------- |
UseSecondaryVersion | 보조 버전 관리 | |||
CheckWriteAndBumpSecondaryVersion | 크기 변경 시 사용 |
특수 핸들
임시 네이티브 컨테이너와 작업할 때 사용할 수 있는 두 가지 특수 핸들이 있습니다.
특수 핸들 | 설명 |
---|---|
GetTempMemoryHandle | Allocator.Temp로 할당된 AtomicSafetyHandle 반환 |
GetTempUnsafePtrSliceHandle | 안전하지 않은 메모리에서 사용할 수 있는 전역 핸들 반환 |
예제: 커스텀 NativeContainer 구현
커스텀 NativeContainer를 구현하여 특정 요구 사항에 맞게 활용할 수 있습니다. 커스텀 NativeContainer는 주로 최적화된 성능이나 특정 로직이 필요한 경우 사용됩니다.
이번 문서에서 제공한 내용은 NativeContainer의 작동 방식에 대한 기본 개요이며, 이를 통해 다양한 스레드 안전한 데이터를 효율적으로 사용할 수 있습니다.