본문으로 바로가기

Hard References와 Soft References

category UnrealEngine/Impl 2023. 9. 28. 23:06

Hard References는 컴파일 타임에 설정된 Resource 또는 Instance에 대한 직접적인 포인터이다.

우리의 캐릭터가 로드되면서, 함께 로딩하는 TObjectPtr로 선언한 언리얼 오브젝트들도 메모리에 함께 로딩된다.

 

즉, 어떤 AActor에서 StaticMeshTObjectPtr로 가지고 있었다고 해보자.

이때 AActor가 생성되면서, StaticMesh도 메모리에 함께 로딩된다.

이를 Hard References 라고 한다.

 

게임 진행에 필수적인 언리얼 오브젝트들은, 이렇게 사용해도 되지만

특정 상황일때만 보여질 오브젝트들은 메모리에 올리지 않고, 필요할 때 (보여질 때) 올리는게 메모리 효율적일 수 있다.

하지만, 로드할 때 생기는 Lag는 감수해야 한다.

 

즉, 필요한 데이터만 로딩하도록 할 수 있는데 이를 Soft References 라고 한다.

필요한 데이터만 로딩하도록 TSoftObjectPtr로 선언하고, 에셋 주소 문자열을 지정해주면 된다.

그리고 실제로 보여질 때 로드해주면 된다.

 

현재 작성중인 Tutorial 에서는 다음과 같이 3개의 SkeletalMesh를 가지고 있다.

이 중, 맨 아래 DragonSwordSoft References 로 실제 사용될 때 로드하게 만든다.

 

기존에 사용하던 메시가 TObjectPtr이였는데, 이를 TSoftObjectPtr로 변경해주었다.

 

생성자에서는, 해당 Mesh의 위치 정보만 알려주면 된다.

그럼 TSoftObjectPtr은 해당 위치를 저장해놓고 있다가, 실제로 로드 할 때 해당 위치의 에셋을 메모리로 올린다.

 

IsPending 함수를 통해 해당 에셋이 로드 되었는지를 판단한다.

로드 되지 않았다면, LoadSynchronous로 로드한다.

이 때, 로드가 되는 첫 시점에서는 순간적인 Lag이 발생할 수 있는데 이를 감수해야 한다.

 

이제 수정한 뒤, 게임을 시작하면 기존에 게임 시작과 함께 로드되는 DragonSword가 없는 것을 볼 수 있다.

이 는, 실제로 우리가 Load 할 때 생성된다.