정적 초기화
리소스를 클래스 생성자나 에디터에서 미리 로드하여 메모리에 할당하는 방식
사용 상황:
- 항상 사용해야 하는 리소스일 경우: 메쉬, 기본 HUD, 게임 필수 UI 등.
- 리소스가 가볍고, 메모리 사용이 문제가 되지 않을 때.
- 게임 초기에 빠르게 준비해야 할 때: 리소스 로드로 인한 지연시 시간을 줄일 수 있다.
장점:
- 오류가 사전에 발견될 가능성이 높다(컴파일 타임에 경로 오류 등 확인)
- 예측 가능한 로드 시간(정해진 시점에서 로드)
단점:
- 사용하지 않는 리소스도 미리 메모리에 로드되어 비효율적일 수 있다.
- 초기 로딩 시간이 길어질 수 있음.
ConstructorHelpers
언리얼 엔진의 C++ 코드에서 리소스(에셋)를 로드할 때, 사용되는 클래스이다.
언리얼의 특정 에셋을 찾고 초기화하는 데 도움을 주는 유틸리티 클래스로, 클래스 생성자 내에서만 사용할 수 있다.
- 주로 Blueprint나 Content Browser에 있는 에셋을 참조할 때 사용
- 런타임 중에는 사용하지 않고, 오로지 생성 시 초기화 용도로 사용
- 경로가 잘못 되었거나 에셋을 찾지 못하면 빌드 중 경고 혹은 에러 발생
- 생성 시 초기화하는 모든 리소스는 메모리에 로드된다. 따라서 필요 없는 에셋을 너무 많이 초기화 하면 성능에 영향을 줄 수 있음
AItem::AItem()
{
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
SetRootComponent(SceneRoot);
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMeshComp->SetupAttachment(SceneRoot);
static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
if (MeshAsset.Succeeded())
{
StaticMeshComp->SetStaticMesh(MeshAsset.Object);
}
static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Glass.M_Glass"));
if (MaterialAsset.Succeeded())
{
StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
}
}
FObjectFinder:
- 머터리얼, 메시 등 리소스(에셋)를 찾아 참조할 때 사용
- 반환 값: UObject*
FClassFinder:
- 특정 블루프린트 또는 C++ 클래스를 찾아 참조할 때 사용
- 반환 값: UClass*
Static 변수에 저장하는 이유
- 프로그램 실행 동안 첫 호출 시, 한 번만 초기화 되므로 메모리에 한 번만 할당된다. 이후 호출에선 기존에 초기화된 데이터를 사용하므로 성능이 최적화된다.
- 모든 인스턴스가 해당 변수를 공유하므로 중복 로드를 방지할 수 있다.
- Asset과 Material을 같은 클래스 인스턴스에서 공유되기 위함이다. 이 액터 클래스를 레벨에 아주 많이 배치하더라도 모든 인스턴스가 이를 공유하기 때문에, 성능면에서 이점이 생긴다.
런타임 로드
런타임 중, 특정 상황에서 필요할 때만 리소스를 로드하는 방식
사용 상황:
- 조건부로 필요한 리소스를 로드해야 할 때: 특정 스테이지 배경음악, 플레이어가 선택한 스킨, 보스 캐릭터
- 리소스의 크기가 크고 메모리 절약이 필요할 때: 고해상도 텍스처, 대형 맵 등
- 사용자 선택에 따라 로드되는 경우
- 자원 관리와 최적화가 중요한 경우: 많은 리소스가 한 번에 메모리에 올라가면 성능 저하가 발생할 수 있음
장점:
- 메모리 사용량 최소화 가능
- 불필요한 리소스 로드를 피해, 초기 로딩 시간을 줄일 수 있음
- 동적이고 확장 가능한 콘텐츠 로드가 가능
단점:
- 잘못된 경로나 런타임 오류가 발생할 가능성
- 복잡한 로드 관리 로직이 필요할 수 있음
UAssetManager
언리얼 엔진에서 리소스를 효율적으로 로드하고 관리하기 위한 고급 시스템이다.
특히 대규모 프로젝트, DLC, 스트리밍 콘텐츠 또는 런타임 리소스 로드가 필요한 게임에서 유용하게 사용된다.
주로 비동기 로드와 메모리 관리를 지원하여 성능 최적화와 자산 관리를 체계적으로 할 수 있도록 설계되었다.
주요 기능:
1. 비동기 로드:
- 리소스가 필요할 때 비동기로 로드하여 게임의 초기 로딩 시간을 줄인다.
- 특정 자산을 로드하는 동안 게임의 다른 작업을 계속 실행할 수 있다.
2. 리소스 패키징 및 스트리밍 관리:
- 특정 리소스를 Primary Asset으로 설정하고, 필요할 때만 로드할 수 있도록 관리한다.
- DLC나 맵 스트리밍 같은 상황에서 활용된다.
3. 종속성 관리:
- 리소스 간의 의존성을 자동으로 추적하여 필요한 모든 리소스를 로드한다.
- 예를 들면, 캐릭터 스킨을 로드하면 해당 텍스처와 머터리얼도 함께 로드되는 식
4. 메모리 최적화:
- 사용하지 않는 리소스를 메모리에서 해제하여 런타임 메모리 사용을 줄일 수 있다.
5. 플랫폼별 리소스 관리:
- 고해상도 텍스처는 고성능 플랫폼에만 포함하도록 설정을 할 수 있다.
'내배캠 > Unreal Engine' 카테고리의 다른 글
액터의 라이프 사이클 (0) | 2025.01.21 |
---|---|
로그 카테고리 사용자 정의 (0) | 2025.01.21 |
빌드 문제 복구하기 (0) | 2025.01.20 |
Class 설계 연습(AI Enemy) (0) | 2025.01.08 |
TArray (0) | 2025.01.06 |