개요
게임 개발에서는 대규모의 데이터를 효율적으로 관리하고 필요시 빠르게 접근할 수 있도록 하는 것이 중요합니다. 언리얼 엔진에서는 다양한 데이터 관리 방식을 제공합니다.
이번 포스팅에서는 Unreal Engine의 데이터 애셋(Data Asset)과 지연 로딩에 대해 정리해보겠습니다.
DataAsset 개념
Data Asset은 Unreal Engine의 UDataAsset 클래스를 상속받아 만든 사용자 정의 데이터 클래스입니다.
이를 활용해 아이템, 캐릭터 스텟, 레벨 등 게임 내 다양한 속성을 외부 파일로 관리하고, 코드에서 해당 데이터를 간편하게 불러올 수 있습니다.
즉, DataAsset은 여러 데이터와 설정값을 관리하기 위해 사용되며, 코드를 수정하지 않고도 게임 데이터를 관리할 수 있다는 장점이 존재합니다.
Data Asset 주요 특징
1. 객체 지향 데이터 구조
- UDataAsset 기반으로 생성되며, 다양한 속성을 정의할 수 있어 필요에 따라 자유롭게 확장이 가능합니다.
2. 직관적인 에디터 통합
- 에디터의 DataAsset 기능을 통해 쉽게 생성하고 관리할 수 있어 비개발자도 손쉽게 사용할 수 있습니다.
3. 다양한 데이터 타입 지원
- 텍스트, 숫자, 배열 등 다양한 데이터 타입을 지원하여 복잡한 구조를 구성할 수 있습니다.
4. 로드 및 캐싱
- 메모리에 로드된 상태에서 사용되므로 필요한 시점에 즉시 데이터를 불러올 수 있습니다.
DataAsset vs DataTable
Data Asset
- 개별 UObject를 기반으로 여러 개의 애셋을 생성하여 오브젝트 단위로 관리가 가능합니다.
- 복잡한 데이터 구조나 상속 구조가 필요할 때 더 유리합니다.
Data Table
- CSV나 JSON 파일로부터 데이터를 불러와 테이블 형태로 관리합니다.
- 주로 일관된 구조의 대규모 데이터를 처리하는데 유리합니다.
DataAsset의 장 / 단점
장점
- 코드와 데이터의 분리
- 데이터 중심 설계를 통해 코드와 데이터를 분리함으로써, 데이터 변경 시 코드 수정 없이 다양한 변경을 빠르게 반영할 수 있습니다. (게임 벨런싱에 특히 유용)
- 유지보수와 협업의 용이성
- 게임 디자이너나 아티스트도 에디터에서 Data Asset을 통해 데이터를 편리하게 수정할 수 있습니다.
- 즉, 비개발자의 협업이 쉬워지며 유지보수와 관리가 편리해집니다.
- 재사용성
- 클래스 기반이므로 필요 시 상속을 통해 다른 클래스나 기능에서 재사용할 수 있어 효율적입니다.
- 타입 안정성
- UDataAsset은 Unreal Engine의 시스템을 통해 타입 안정성을 보장하여 잘못된 데이터 사용을 방지합니다.
- 특히 큰 규모의 프로젝트에서 데이터 오류를 줄이는데 도움이 됩니다.
- 메모리 관리
- Unreal의 메모리 관리 방식에 의해 효율적으로 로드되고 캐시되어, 런타임 성능에 영향을 덜 미칩니다.
단점
- 복잡한 데이터 변경 시 비효율적
- 큰 규모의 데이터 변경이 필요한 경우 Data Asset을 하나씩 수정하는 과정이 번거로울 수 있습니다.
- 때로는 외부 데이터 관리 도구(CSV, JSON)와 결합하여 사용하는 것이 유리할 수 있습니다.
- 빌드 의존성
- DataAsset 변경 시 프로젝트를 다시 빌드해야 할 수도 있어, 개발 중 불편할 수 있습니다.
- 상속 구조가 깊어질 경우 프로젝트의 복잡도가 증가합니다.
- 큰 데이터의 메모리 부담
- 대규모의 Data Asset이 메모리에 로드될 경우 메모리 사용량이 증가할 수 있어, 메모리 관리가 중요한 경우 최적화가 필요합니다.
지연 로딩
지연 로딩은 실제로 필요한 시점까지 자산을 메모리에 로드하지 않는 방식으로 메모리 최적화에 도움을 줍니다.
Unreal Engine에서는 Soft Reference(소프트 레퍼런스) 를 사용하여 지연 로딩을 쉽게 구현할 수 있으며, 특히 큰 프로젝트에서 리소스 관리 효율을 높이는데 유용하며 DataAsset과 같은 외부 리소스를 로드가허나 접근할 때 자주 사용됩니다.
즉, 에셋을 SoftObjectPath나 TSoftObjectPtr로 선언하면, 해당 자산은 경로로만 저장되고, 사용 시점에 로드됩니다.
FSoftObjectPath
Unreal Engine에서 일반적인 애셋 로딩 방식은 직접 객체를 메모리에 로드하는 방식입니다. 그러나, 직접 로드된 애셋은 메모리에 상주하게 되므로, 게임에서 사용할 애셋이 많을 경우 메모리와 로딩 시간이 크게 늘어날 수 있습니다.
FSoftObjectPath는 Unreal Engine의 경로 표현 클래스입니다. 애셋의 경로를 문자열로 저장하여 직접 로드하지 않고도 경로만을 유지할 수 있습니다.
FSoftObjectPath 예시
// FSoftObjectPath 사용 예시
FSoftObjectPath AssetPath("/Game/Path/To/Asset.Asset"); // 애셋의 경로만 저장됨
UObject* LoadedAsset = AssetPath.TryLoad(); // 필요한 시점에 로드
AssetPath는 애셋의 경로를 문자열로만 보유하고, 실제 UObject는 메모리에 로드하지 않습니다. TryLoad()를 호출하는 시점에만 애셋이 메모리에 로드되며, 그전까지는 경로 정보만으로 애셋의 참조를 관리하는 방식으로 메모리와 로딩 성능을 최적화할 수 있으며, 필요한 자산만 로드하여 지연 로딩을 구현할 수 있습니다.
TSoftObjectPtr
TSoftObjectPtr은 TWeakObjectPtr과 유사하지만, Unreal Engine에서 지연 로딩에 특화된 스마트 포인터입니다. 객체가 아직 메모리에 로드되지 않아도 참조할 수 있으며, 필요 시 경로를 통해 객체를 메모리에 로드합니다.
TSoftObjectPtr은 애셋이 로드되어 메모리에 있을 때도 경로를 통해 참조를 관리합니다. 따라서 애셋이 아직 메모리에 로드되지 않은 경우에도 경로를 통해 애셋에 접근할 준비가 되어있는 상태입니다. 이를 통해 실제로 필요할 때까지 애셋을 메모리에 로드하지 않는다는 점에서 최적화에 유리합니다.
TSoftObjectPtr 예
// TSoftObjectPtr 사용 예시
TSoftObjectPtr<UTexture2D> SoftTexturePtr("/Game/Path/To/Texture.Texture");
// SoftTexturePtr은 현재 메모리에 로드되지 않은 상태에서 경로만 참조
UTexture2D* Texture = SoftTexturePtr.LoadSynchronous(); // 필요할 때 메모리에 로드
'Game Programming > Unreal Engine' 카테고리의 다른 글
[Unreal Engine] Delegate (0) | 2024.10.30 |
---|---|
[Unreal Engine] 스마트 포인터 (C++ vs UE) (0) | 2024.10.29 |
[Unreal Engine 5] AI Controller (0) | 2024.10.01 |
[Unreal Engine 5] FABRIK IK (0) | 2024.08.25 |
[Unreal Engine] 리플렉션 시스템, CDO (0) | 2024.07.26 |