3냥 집사이면서 게임 개발자입니다.
언리얼 컨테이너 라이브러리 1 - Array, Set 본문
언리얼에서 제공하는 대표 컨테이너 라이브러러 TArray, TSet의 내부 구조에 대한 내용과
각 컨테이너 라이브러리의 장단점을 파악하고, 알맞게 활용하는 법에 대해 정리하겠습니다.
언리얼 컨테이너 라이브러리
- 언리얼 엔진이 자체 제작해 제공하는 자료구조 라이브러리입니다.
- 줄여서 UCL(Unreal Container Library) 라고도 합니다.
- 언리얼 오브젝트를 안정적으로 지원하며 다수 오브젝트 처리에 유용하게 사용됩니다.
- 언리얼 C++은 다양한 자료구조 라이브러리를 직접 만들어 제공하고 있습니다.
- 실제 게임 제작에 유용하게 사용되는 라이브러리는 TArray, TMap, TSet 입니다. (T = Template)
C++ STL 과 언리얼 컨테이너 라이브러리의 차이점
- C++ STL은 범용적으로 설계되어 있습니다.
- 표준이기 때문에 호환성이 높습니다.
- 많은 기능이 엮여 있어 컴파일 시간이 오래 걸립니다.
- 언리얼 컨테이너 라이브러리는 언리얼 엔진에 특화되어 있습니다.
- 언리얼 오브젝트 구조를 안정적으로 지원합니다.
- 가볍고 게임제작에 최적화되어 있습니다.
* 앞으로 언리얼 엔진을 사용해 코딩할 땐 언리얼 엔진이 직접 만든 컨테이너 라이브러리를 사용해야 합니다.
언리얼 C++ 주요 컨테이너 라이브러리
- 두 라이브러리의 이름과 용도는 유사하지만, 내부적으로 다르게 구현되어 있습니다.
- TArray : 오브젝트를 순서대로 담아 효율적으로 관리하는 용도로 사용합니다. (내부적으로 vector와 유사함)
- TSet : 중복되지 않는 요소로 구성된 집합을 만드는 용도로 사용합니다.
- TMap : 키, 벨류 조합의 레코드를 관리하는 용도로 사용합니다.
용도는 C++ STL 과 비슷하지만 Set과 Map의 경우는 내부 구조가 다릅니다.
TArray의 구조와 활용 방법
- TArray는 가변 배열(Dynamic Array) 자료구조
- STL의 vector와 동작 원리가 유사합니다.
- 게임 제작에서는 가변 배열 자료구조를 효과적으로 활용하는 것이 좋습니다.
- 데이터가 순차적으로 모여있기 때문에 메모리를 효과적으로 사용할 수 있고 캐시 효율이 높습니다.
- 컴퓨터 사양이 좋아지면서, 캐시 지역성(Locality)으로 인한 성능 향상은 굉장히 중요해졌습니다.
- 임의 데이터의 접근이 빠르고, 고속으로 요소를 순회하는 것이 가능합니다.
- 가변 배열의 단점
- 맨 끝에 데이터를 추가하는 것은 가볍지만, 중간에 요소를 추가하거나 삭제하는 작업은 비용이 큽니다.
- 데이터가 많아질수록 검색, 삭제, 수정 작업이 느려지기 때문에, 많은 수의 데이터에서 검색 작업이 빈번하게 일어난다면 TArray 대신 TSet을 사용하는 것이 좋습니다.
TArray의 내부 구조는 같은 규격을 가진 데이터들이 연속적으로 배열되어있습니다.
배열이 시작하는 곳의 주소는 GetData() 함수를 통해 가져올 수 있으며, 맨 끝에 추가하는 함수로는 Add/ Emplace()/ Append() 함수가 존재합니다. 중간 삽입 삭제는 Insert 함수를 통해 가능합니다.
C++ STL 과 유사한 부분이 많습니다. push_back()과 emplace_back() 의 객체 삽입 방식에 따른 차이또한 TArray 의 Add/ Emplace()에 존재합니다. 반드시 언리얼 문서를 참고하시는 것이 좋을 듯 합니다.
TSet의 구조와 활용 방법
- STL의 set과 언리얼 TSet의 비교
- STL set의 특징
- STL Set은 이진 트리로 구성되어 있어 정렬을 지원합니다.
- 이진트리다 보니 메모리 구성이 효율적이지 않습니다.
- 요소가 삭제될 때 균형을 위한 재구축이 일어날 수 있습니다.
- 모든 자료를 순회하는데 적합하지 않습니다.
- 언리얼 TSet의 특징
- TSet은 해시테이블 형태로 키 데이터가 구축되어 있어 빠른 탐색이 가능합니다.
- 동적 배열의 형태로 데이터가 모여있습니다.
- 데이터를 빠르게 순회할 수 있습니다
- 데이터를 삭제해도 재구축이 일어나지 않습니다.
- 자료에 비어있는 데이터가 있을 수 있습니다.
- 따라서 STL set과 언리얼 TSet의 활용 방법은 서로 다르기 때문에 주의해야 합니다.
- STL의 unordered_set과 유사하게 동작하지만 동일하진 않습니다.
- TSet은 중복 없는 데이터 집합을 구축하는데 유용하게 사용할 수 있습니다.
내부 구조는 동적 가변 배열의 형태를 갖고 있으며, 중간 중간 데이터가 비어있을 수 있습니다.
해시테이블로 구현되어 있어 빠른 탐색이 가능하며, 데이터를 추가할 때 비어있는 부분을 빠르게 메꾸는 형태로 데이터를 추가할 수 있습니다.
중간에 데이터가 빠져있을 순 있지만, 데이터가 모여있기 떄문에 빠른 탐색이 가능합니다.
더 자세한 내용을 알고싶으시다면 언리얼 문서를 읽어보시는걸 추천드립니다.
언리얼에서 제공하는 컨테이너와 멤버 함수, 알고리즘 라이브러리를 사용해 중단점을 찍어서 확인했을 때
정상적으로 작동하는지 확인할 수 있었습니다.
언리얼 컨테이너의 시간 복잡도 비교
TArray 의 경우 접근 O(1) 검색 O(N) 삽입 O(N), 삭제 O(N) 빈틈없는 메모리, 가장 높은 접근 성능, 가장 높은 순회성능을 갖고 있습니다.
TSet 의 경우 접근, 검색, 삽입, 삭제 모두 상수 시간복잡도 O(1) 를 갖고 있으며 빠른 중복 감지가 특징입니다.
참고 사이트 (언리얼 문서)
https://docs.unrealengine.com/5.1/ko/array-containers-in-unreal-engine/
TArray: 언리얼 엔진의 배열
docs.unrealengine.com
https://docs.unrealengine.com/5.1/ko/set-containers-in-unreal-engine/
TSet
TSet, 세트는 보통 순서가 중요치 않은 상황에서 고유 엘리먼트를 저장하는 데 사용되는 고속 컨테이너 클래스입니다.
docs.unrealengine.com
'Unreal Engine 5 > 언리얼 C++' 카테고리의 다른 글
언리얼 엔진의 메모리 관리 (0) | 2023.07.27 |
---|---|
언리얼 컨테이너 라이브러리 2 - 구조체와 Map (0) | 2023.07.27 |
언리얼 C++ 설계 3 - 델리게이트 (Delegate) (0) | 2023.07.26 |
언리얼 C++ 설계 2 - 컴포지션 (Composition) (0) | 2023.07.26 |
언리얼 C++ 인터페이스 클래스와 C++ 인터페이스 클래스와 차이점 (0) | 2023.07.26 |