보키_기록용

월드 파티션이란? 본문

언리얼/World Patitoin

월드 파티션이란?

bokki0117 2022. 11. 1. 18:00

월드 파티션 (World Partition)

기존의 월드 컴포지션(World Composition)을 대체하는 자동 데이터 관리 및 거리 기반 레벨 스트리밍 시스템.

 

기존에는 그리드 셀로 나눠진 단일 퍼시스턴트 레벨에 월드를 저장함으로써 커다란 레벨을 서브 레벨로 나눠야 했던 것과 달리, 스트리밍 소스와 셀의 거리에 따라 로드, 언로드하는 자동 스트리밍 시스템이다.

  • 월드 파티션 활성화 방법 세가지는 링크 참조

 

World Partition의 목표

  • 다수의 사용자가 파일을 관리할 때 문제가 많이 생겼던 부분이 개선됨.
  • 수동 레벨 관리를 없앨 수 있다.
  • 런타임 레벨 토폴로지의 미세조정을 가능하게 할 수 있다. (에디터와 레벨 간의 완전한 구분)
  • 거리 기반 자동 레벨 스트리밍 추가 (레벨 스트리밍 볼륨을 추가할 필요없음)

 

World Partition 관련 기능 4가지

1. 액터 당 한 개의 파일 (One File Per Actor, OFPA)

2. 레벨 인스턴싱 (Level Instancing)

3. 데이터 레이어 (Data Layers)

4. 계층형 레벨 오브 디테일 (Hierarchical Level of Detail, HLOD)

 

액터 당 한 개의 파일 (One File Per Actor, OFPA)

이전에는 레벨 내 하나 이상의 액터를 변경하고 싶을 때, 소스 컨트롤에서 레벨 파일을 체크아웃해야 했다. 이 경우 액터 변경 작업이 끝날 때까지 다른 팀원은 해당 파일에 접근 할 수없어 개발 프로세스가 느려졌다. 

 

OFPA는 액터 인스턴스의 데이터를 외부 파일에 저장하여 액터 변경 시 메인 레벨 파일을 저장할 필요가 없게 함으로써 사용자 간 작업이 겹치는 상황을 줄여 준다. 

 

※ OFPA는 월드 파티션 사용 시 기본적으로 활성화되어 있다. OFPA는 월드파티션과는 개별적인 시스템으로 월드 파티션 레벨 밖에서 OFPA를 사용하는 것도 가능하지만 실험적인 기능으로 기본적으로 비활성화되어 있다. 활성화 방법

 

레벨 인스턴싱 (Level Instancing)

월드 파티션이 아닌 월드를 월드 파티션 시스템으로 쉽게 이식할 수 있게 해주는 레벨 기반 워크플로.

 

  • 여러 액터를 특별히 정렬하고 재사용하는 경우 서브레벨을 계층형으로 중첩사용 가능하다. 뷰포트에서 바로 편집 가능하다.
  • 이런 벽돌 리소스 2개를 가지고 레벨 인스턴스를 통해 draw call도 줄이고 리소스 조합만으로도 다양한 형태의 벽을 만들 수 있다.

Level Instancing in Unreal Engine | Unreal Engine 5.0 Documentation

 

Level Instancing

An introduction to Level Instancing and how it can be used in your projects

docs.unrealengine.com

 

데이터 레이어 (Data Layers)

월드 파티션(World Partition) 안에 있는 시스템으로, 액터를 별도 레이어로 구성하는 데 사용된다. 로드하거나 언로드하여 월드를 구성할 수 있다.

 

기존 level editor의 layer system을 대체하는 시스템으로, 에디터에서 게임플레이 엘리먼트와 환경 에셋을 분리할 수 있다.(아티스트는 게임플레이 트리거나 오브젝트와 상호작용 없이 특정 엘리먼트를 작업할 수 있다.)

 

언리얼 엔진의 월드 파티션 - 데이터 레이어 | 언리얼 엔진 5.0 문서 (unrealengine.com)

 

월드 파티션 - 데이터 레이어

데이터 레이어의 개요와 프로젝트에서 데이터 레이어를 사용하는 방법을 소개합니다.

docs.unrealengine.com

 

계층형 레벨 오브 디테일 (Hierarchical Level of Detail, HLOD)

월드 파티션(World Partition) 시스템은 그리드를 사용하여 런타임 시 월드를 다이내믹하게 로드되고 언로드될 수 있는 셀로 분리한다. 하지만, 멀리 있는 산과 나무, 절벽 등 멀리 떨어져 있고 상호작용이 없는 액터를 계속 보이게 해야 할 때가 있다.

  • 커스텀 HLOD 레이어를 사용하여 대량의 스테틱 매시 엑터를 조직하고 단일 프록시 메시와 머티리얼을 생성한다.
  • 이 기법을 사용하여 언로드된 월드 파티션 그리드 셀을 시각화하고, 프레임당 드로 콜 수를 줄이고, 퍼포먼스를 향상할 수 있다.
  • 대규모 오픈 월드와 함께 사용할 때 유용하다.

  • 플레이어(사용자)를 중심으로 3D 반구가 생성 되고, 반구 안에 해당 되는 셀은 로드가 되는 형식
  • 셀의 크기와 반구(셀 로드 범위)의 크기를 설정할 수 있으며, 로드되는 데이터는 데이터 레이어를 통해 제어가 가능
  • 레이어 타입
    • Instancing
      • 셀마다 액터 하나를 생성하며 호환 가능한 에셋마다 단일 컴포넌트를 둔다.
      • 월드에 동일한 스태틱 메시를 사용하는 스태틱 메시 액터 10개가 있으면, 결국 인스턴스가 10개인 단일 인스턴스 컴포넌트를 사용하게 된다.
      • 그저 랜더링 최적화용 시각적 표현(피직스나 게임플레이요소 없음.)
      • 128M ~ 768M
    • Merged Mesh
      • 자손 레이어(인스턴싱 레이어)와 함께 생성된다.
      • 이 레이어도 셀마다 액터를 하나씩 만들지만, 셀의 모든 메시를 취해 셀 전체를 나타내는 새 스태틱 메시 하나로 병합한다.
      • 멀리있는 요소는 셀당 draw call이 단 하나가 된다.
      • 768M ~ 2KM
    • Simplified Mesh
      • 또 다른 Merged Mesg Layer. 2KM부터 무한히 생성 후 '항상 로드됨'으로 설정한다.
      • 헬리콥터같은 걸 타서 월드 전체를 보더라도 전부 괜찮아 보이게 할 수 있다.
      • 이것만으로도 탑뷰를 생성해서 미니맵을 만들 수 있다.

언리얼 엔진의 월드 파티션 - 계층형 레벨 오브 디테일 | 언리얼 엔진 5.0 문서 (unrealengine.com)

 

월드 파티션 - 계층형 레벨 오브 디테일

월드 파티션 월드에서 계층형 레벨 오브 디테일을 사용하는 방법입니다.

docs.unrealengine.com

 


 

월드 파티션 사용하기

  • 월드를 단일 퍼시스턴트 레벨 파일에 저장
  • 환경설정 가능한 런타임 그리드를 사용해 공간을 스트리밍 가능한 그리드 셀로 다시 나눔
  • 이런 셀은 플레이어같은 스트리밍 소스의 존재로 인해 로딩, 언로딩 됨
  • 엔진은 특정 시간에 플레이어가 보고 상호작용하는 부분만 로드

 

월드 파티션 내 액터

디테일(Details) > 월드 파티션(World Partition)

  • 옵션설명
런타임 그리드
(Runtime Grid)
(월드가 분할됐으면) 이 액터가 파티션에서 어느 파티션 그리드에 배치될지를 결정한다. 

없음(None) 으로 지정한 경우 그 파티션에 남겨진다.
공간적으로 로드되었는지 여부
(Is Spatially Loaded)
액터가 공간적으로 로드되는지 여부를 결정한다.
  • 옵션을 활성화하면 이 액터는 비활성화된 데이터 레이어에 할당되지 않았고 스트리밍 소스의 범위 내에 있을 때 로드된다.
  • 옵션을 비활성화하면 이 액터는 비활성화된 데이터 레이어에 할당되지 않았을 때 로드된다.

뭔소린지 모르겠는데... Is Spatially Loaded가 활성화되면 데이터 레이어가 활성화 되더라도 "스트리밍 소스의 범위를 벗어나면 생성되지 않습니다" 라는 느낌인거같다.

 

 

런타임의 그리드 내 그리드 셀의 스트리밍은 다음 두 가지 요소로 결정된다.

  • 스트리밍 소스(Streaming Sources) 
  • 런타임 그리드 세팅(Runtime Grid Settings)

 

스트리밍 소스

  • 월드 내 위치를 결정하고, 주변 셀의 로딩을 유발하는 컴포넌트
  • 플레이어 컨트롤러(Player Controllers)는 스트리밍 소스이다.
  • 월드 파티션 스트리밍 소스(World Partition Streaming Source) 컴포넌트를 사용하여 다른 스트리밍 소스를 월드에 추가할 수 있다.
  • ex ) 
    • 스트리밍 소스 컴포넌트는 플레이어가 텔레포트할 위치에서 활성화되어 그곳의 셀을 로딩할 수 있다.
    • 그리드 셀이 로딩되면 플레이어는 그 위치로 텔레포트하고 스트리밍 소스 컴포넌트가 비활성화된다.
    • 플레이어의 이전 위치에는 이제 스트리밍 소스가 없으므로, 해당 그리드 셀은 언로딩된다.

 

1 ) 플레이어를 스트리밍 소스로 사용하기

  • PlayerController 의 스트리밍 소스 활성화 옵션이 체크되어있으면 각 플레이어 컨트롤러가 월드 파티션 스트리밍 소스로 사용된다.
  • 이 옵션은 디폴트로 활성화되어 있다.

2 ) 월드 파티션 스트리밍 소스 컴포넌트 사용

  • 플레이어 컨트롤러는 기본적으로 스트리밍 소스가 활성화 되어있지만, 다른 스트리밍 소스를 월드에 추가할 경우

  • 블루프린트 함수 스트리밍 소스 활성화(Enable Streaming Source) 와 스트리밍 소스 비활성화(Disable Streaming Source)를 사용하여 스트리밍을 활성화 및 비활성화한다.

 

런타임 그리드 세팅

  • 월드 세팅 패널 > 월드 파티션 세팅
  • 2D 런타임 해시(2D Runtime Hash) 그리드가 디폴트로 제공됨. (두 가지 이상의 그리드를 사용하면 퍼포먼스에 악영향을 줄 수 있다.)

 

 

언리얼 엔진의 월드 파티션 | 언리얼 엔진 5.0 문서 (unrealengine.com)

 

월드 파티션

월드 파티션 시스템의 개요와 이 시스템을 프로젝트에 사용하는 방법

docs.unrealengine.com

 

이외의 참고

(129) 언리얼 엔진 5 월드 구성: 아트 관점에서 UE5를 사용하여 월드를 구성하고 협업하는 방법 | 언리얼 서밋 2021 - YouTube

(129) New World Building Features | Inside Unreal - YouTube

 

'언리얼 > World Patitoin' 카테고리의 다른 글

로딩화면에서 Throbber 화면 없애기  (0) 2025.03.12
데이터 레이어 사용하기  (0) 2022.11.01
Comments