해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.
공간 분할(Spatial Partitioning)은 왜 필요할까?
게임 월드에는 수천~수십만 개의 액터와 충돌체, 렌더링 오브젝트가 존재한다. 만약 매 프레임마다 “전체 오브젝트와의 충돌 체크”나 “전체 액터의 위치 검사”를 한다면 감당할 수 없을 것이다.
그래서 등장한 개념이 바로 공간을 잘게 쪼개고, 필요한 영역만 처리하는 구조, 즉 공간 분할이다.
쿼드트리(QuadTree)
쿼드트리(QuadTree)는 2차원 공간을 4개의 동일한 영역으로 재귀적으로 분할하여 공간을 효율적으로 관리하는 트리 구조다.
- 루트 노드 → 전체 공간
- 한 노드가 분할되면 NW(북서), NE(북동), SW(남서), SE(남동) 네 개의 자식 노드 생성
- 영역을 계속 분할하여 밀집된 공간만 세분화
의 방식으로 이루어지는 알고리즘이다.
이를 이용하여 게임에서는 다양한 용도로 활용할 수 있다.
특히 2D 게임이나 맵, UI, 타일 기반 시스템에서는 많은 오브젝트 중에서 특정 위치 주변의 오브젝트만 빠르게 찾는 방식으로 다음과 같은 일을 할 수 있다.
- 충돌 검사
- 시야 판정
- A* Pathfinding 위한 NavMesh 단순화
- 지형 편집
- RTS 게임의 유닛 탐색
쿼드트리가 없다면 매번 전체 오브젝트 선형 탐색 (O(N)) → 매우 비효율적 쿼드트리를 사용하면 보통 O(log N) 수준으로 빠르게 줄어든다.
옥트리(Octree)
옥트리(Octree)는 3차원 공간을 8개 영역(옥트)으로 분할하는 자료구조다. 쿼드트리가 2D용이라면 옥트리는 3D 게임 엔진, 3D 그래픽스, 렌더링, 충돌 탐색에서 사용된다.
언리얼 엔진 내부에서도 성능 최적화를 위해 여러 곳에서 옥트리 기반 구조를 사용한다.
월드 파티션 시스템
게임 개발에서 성능 최적화의 핵심 요소 중 하나는 “얼마나 적은 비용으로 필요한 오브젝트만 처리하느냐”이다.
언리얼엔진에서는 이를 위해 월드 파티션 시스템을 지원한다. 월드 파티션 시스템은 언리얼 엔진 5부터 도입된 기능으로, 거대한 오픈 월드를 자동으로 타일 단위로 분할·로딩·언로드하는 시스템이다. 이를 통해 거대한 월드나 오픈 월드 등을 자동으로 스트리밍하면서 메모리와 성능을 효율적으로 관리해줄 수 있도록 한다.
World Partition의 구성 요소
| 구성 요소 | 설명 |
|---|---|
| Cell(그리드 타일) | 월드를 자동으로 분할한 최소 단위 |
| Streaming Source | 플레이어, 카메라 등 로딩 기준 |
| Data Layers | 특정 상황에서만 필요한 레이어(예: 던전, 이벤트 지역) |
| HLOD (Hierarchical LOD) | 멀리 있는 오브젝트를 병합하여 렌더링 최적화 |
또한 월드 파티션 활성화 시 셀 크기, 로딩 범위 등을 조정하여 얼마만큼의 오브젝트들을 로드할 건지 세부조정할 수 있다.
World Partition의 사용법
기본적으로 월드 파티션에 등록된 오브젝트들은 스트리밍 소스에 따라 비동기적으로 로드된다. 하지만 만약 항상 로드되어야 하는 오브젝트가 있다면 아래와 같이 디테일 - 월드 파티션 - Is Spatially Loaded 옵션을 끄면 항상 월드 내에 로드된다.
이외에도 동적으로 스트리밍 소스를 이용하여 활성화와 비활성화를 구성할 수도 있다.