[언리얼 엔진] 비동기 애셋 로딩
- ⭐ Game Programming/Unreal Document
- 2021. 9. 23.
비동기 애셋 로딩 (Asynchronous Asset Loading)
UE4에서 애셋 비동기 로딩을 쉽게 하기 위한 신규시스템이 도입되었다. 데이터 로드 및 참조에 사용되는 방법은 일반적으로 두가지가 있다.
FSoftObectPath와 TSoftObjectPtr
FSoftObjectPath는 애셋의 전체이름이 저장된 스트링이있는 구조체이다.
애셋의 참조 정보와 생성 메소드들을 포함한다. 에디터에서는 UObject처럼 표시된다.
TSoftObjectPtr은 FsoftObjectPath를 감싸는 TWeakObjectPtr 이다.
에디터 UI에서 특정 클래스만 선택되게끔 제한하도록 하는 역할. 블루프린트에서 애셋의 SoftReference로 표시
애셋 레지스트리와 오브젝트 라이브러리
애셋 레지스트리는 애셋에 대한 메타데이터를 저장하여, 검색 및 질의를 가능하게 한다. 에디터에서는 보통 콘텐츠 브라우저에 정보를 표시하기 위해 사용. 게임에서는 현재 로드되지 않은 게임 플레이 애셋에 대한 메타데이터 질의를 하는 데도 사용 가능. 프로퍼티에 ASsetRegistrySearchable 태그를 추가해야 한다.
오브젝트 라이브러리는 로드되지 않은 애셋 그룹을 가지고 작업할 때 사용된다. 로드된 오브젝트와 로드되지 않은 오브젝트의 경우 공유 베이스 클래스를 상속한다. 폴더 경로를 추가하면 하위 폴더의 모든 애셋이 추가된다.
StreamableManager 와 비동기 로딩
FStreamableManager는 비동기 로딩을 지원하는 매니저 클래스이다. FStreamableManager를 싱글톤으로 생성하고, FSoftObjectPath를 받아와서 로드를 한다. SyncronusLoad는 동기 로딩으로 메인쓰레드를 오래 잡아둘수도 있다. RequestAsyncLoad를 사용하면 애셋을 비동기로 로드한 다음 델리게이트를 지정하여 호출할수 있게 한다.
void UGameCheatManager::GrantItems()
{
TArray<FSoftObjectPath> ItemsToStream;
FStreamableManager& Streamable = UGameGlobals::Get().StreamableManager;
for(int32 i = 0; i < ItemList.Num(); ++i)
{
ItemsToStream.AddUnique(ItemList[i].ToStringReference());
}
Streamable.RequestAsyncLoad(ItemsToStream, FStreamableDelegate::CreateUObject(this, &UGameCheatManager::GrantItemsDeferred));
}
void UGameCheatManager::GrantItemsDeferred()
{
for(int32 i = 0; i < ItemList.Num(); ++i)
{
UGameItemData* ItemData = ItemList[i].Get();
if(ItemData)
{
MyPC->GrantItem(ItemData);
}
}
}