안선생의 개발 블로그
[UE5] 언리얼 하드,소프트 참조 본문
하드 참조 (Hard Reference)
- 직접 참조: 하드 참조는 리소스를 직접 참조하는 방식입니다. 예를 들어, 특정 오브젝트나 액터에 대해 하드 참조를 사용하면, 그 오브젝트가 필요할 때마다 언리얼 엔진은 해당 오브젝트를 메모리에 항상 로드해 둡니다.
- 메모리 사용: 하드 참조는 메모리에 상주하게 되므로, 큰 오브젝트나 많은 리소스를 하드 참조할 경우 메모리 사용량이 증가할 수 있습니다.
- 로드 타임: 하드 참조된 오브젝트는 게임이 시작되거나 해당 오브젝트가 필요할 때 미리 로드되기 때문에, 필요할 때 바로 사용할 수 있지만, 초기 로드 시간은 길어질 수 있습니다.
소프트 참조 (Soft Reference)
참고로, 소프트 참조는 필요할 때만 리소스를 로드하는 방식으로, 메모리 관리에 유리하지만, 처음 접근할 때 로드 시간이 추가될 수 있습니다.
하드참조 대표적인 예시
보통 블루프린트에서 많이 일어난다.
Cast, spawnactor에서 자주 일어나며 이 함수들을 사용시 무조건 메모리에 로드 되므로 메모리 낭비가 일어 날 수 있다.
상속관계에서도 일어난다.
만약 A부모를 상속받는 B가 있으면 B는 A에 있는 자산을 모두 하드 참조 하므로 사용하지 않은 리소스가 포함되어 메모리 낭비가 일어 날 수 있다.
이렇게 보면 하드 참조는 피해야될거 처럼 보인다. 근데 하드참조에 장점도 있다.
장점
- 하드 참조된 오브젝트는 게임이 시작되거나 해당 오브젝트가 필요할 때 미리 로드되기 때문에, 필요할 때 바로 사용할 수 있다.
- 로딩을 걱정 안해도 된다.
단점
불필요한 메모리 낭비가 일어난다.
그럼 하드 참조는 언제 쓰는게 좋을까?
대표적인 예시로는 캐릭터를 항상 참조하는것은 괜찮다. 왜냐하면 캐릭터는 항상 메모리에 로드되어 있기 때문에 캐릭터 참조는 메모리 낭비가 일어날 수 없다.
반대로 메인 메뉴만 있는곳에서는 하드 참조할 필요가 있을까? 메인 메뉴에는 캐릭터가 로드 되어있을 필요가 없기때문에 하드 참조를 할시 캐릭터 메모리가 1GB라면 쓸데없는 메모리를 낭비하기 때문에 초기에 1GB가 낭비되어 로딩시간이 길어 질 수 있다.
이러한 이유로 하드참조를 쓸 때 안쓸때를 잘 구분해야한다.
하드참조 볼 수 있는 방법은 ?
사이즈 맵 통해서 확인 할 수 있다.
그렇다면 C++에서는 하드참조가 안일어나나?
그것또한 아니다 C++에서도 TSubclassOf<Actor>로 가질 수 있다.
하드참조를 피하기 위해 만들어진 소프트 참조에 대해서 알아보자.
소프트 참조를 선언하는 방법이며 위에는 C++ 아래는 블루프린트이다.
하드참조와 달리 소프트 참조는 자산을 가리키는 경로만 가르키기 때문에 자산이 로드 되지 않는다.
즉 자산을 사용할라면 수동으로 로드해야 한다는거를 의미한다.
장점
- 필요할 때만 메모리가 로드되므로 메모리 낭비가 일어나지 않는다.
단점
- 매번 자산을 수동으로 로드하기 때문에 코드가 복잡해진다.
- 컨트롤 하기가 어렵다. 이번 프레임에 객체가 필요할 수 있지만 소프트 참조는 몇 프레임이 지나야 로드됩니다.
그럼 언제 하드 참조, 소프트 참조를 사용해야 될까?
간단하다 중요한 주요 자산에서는 하드 참조를 사용하고, 필요하지 않는 자산에서는 소프트 참조를 쓰면된다.
하드 참조
- 항상 필요한 오브젝트: 게임이 시작할 때부터 끝날 때까지 항상 사용되는 오브젝트나 리소스(예: 주요 캐릭터, 기본 UI 요소 등)는 하드 참조로 설정하는 것이 적합합니다.
- 성능 우선: 오브젝트를 즉시 사용해야 하며 로딩 시간을 줄이고자 할 때 하드 참조를 사용하는 것이 좋습니다.
소프트 참조
게임 내에서 특정 리소스가 드물게 사용되거나, 특정 상황에서만 필요한 경우 소프트 참조를 사용합니다. 예를 들어, 특정 이벤트에서만 등장하는 캐릭터나 오브젝트, 또는 특정 레벨에서만 사용되는 리소스를 소프트 참조로 관리할 수 있습니다.
여기서 중요한거는 하드 참조가 꼭 나쁘지 않다는 점이다.
'언리얼 > 언리얼 C++' 카테고리의 다른 글
[UE5] 언리얼 델리게이트 바인딩 종류 (1) | 2024.03.23 |
---|---|
[UE5] TObjectPtr (0) | 2023.11.18 |
[UE5 C++] OnComponentBeginOverlap (0) | 2023.11.16 |
[UE5] 인터페이스 (0) | 2023.11.09 |
[UE5] C++ 블루프린트 연결하기 (0) | 2023.11.02 |