인프런 커뮤니티 질문&답변

임동재님의 프로필 이미지
임동재

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

14강 언리얼 오브젝트 관리 II - 패키지

패키지 관련 코드 질문이요.

해결된 질문

작성

·

98

·

수정됨

0

UPackage* StudentPackage = ::LoadPackage(nullptr, *PackageName, LOAD_None);

if (nullptr == StudentPackage)

{

UE_LOG(LogTemp, Warning, TEXT("패키지를 찾을 수 없습니다."));

return;

}

//내부에 가지고 있는 에셋을 모두 다 로딩해주는 함수

StudentPackage->FullyLoad();

다음 코드에서 내부에 가지고 있는 애셋을 모두 다 로딩해주는 함수가 FullyLoad()라고 들었는데요.
애초에 하나의 패키지는 하나의 애셋만 가질수있는 구조라고 들었는데 그러면 FullyLoad()는
애셋을 하나만 로딩해주는 거 아닌가요?

 

그리고 SaveStudentPackage( ) 함수에서 패키지를 생성하고 저장하기 전에

UPackage* StudentPackage = ::LoadPackage(nullptr, *PackageName, LOAD_None);

if (StudentPackage)

{

StudentPackage->FullyLoad();

}
이 작업을 하면 더 안정적 이다고 하셨는데, 잘 이해가 안가요.. 제가 이해한 바로는
로딩해주는 작업은 에디터 상 애셋을 코드상에 가져오기 위해 쓰이는 걸로 알고있는데
그게 아닌가요?

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

음 제가 영상에서 UPackage는 하나의 애셋만 가질 수 있다고 설명했었나요? 시간대를 알려주시면 한번 확인해보겠습니다.
하나의 UPackage는 여러 개의 asset을 소유할 수 있습니다. 아마 5.1 이후 버전에서는 대표 애셋을 제외한 애셋이 콘텐츠 브라우저에 안나타나서 그런게 아닌가 싶네요. 5.1로 진행하시면 여러개의 애셋을 볼 수 있습니다.
두 번째 질문에서 안정적이라는 의미는 FullyLoad 함수 호출에서 진행이 예외없이 잘 수행된다의 의미로 이해하시면 될 것 같습니다.

임동재님의 프로필 이미지
임동재
질문자

UPackage는 하나의 애셋만 가질 수 있다는 건 아무래도 제가 설명을 잘 못 들은 거
같네요. 질문이 몇가지 더 있는데요.
FullyLoad 함수 호출에서 진행이 예외없이 잘 수행된다는 말씀이 패키지가 이미 존재할 때
에러가 발생하지 않도록 해준다는 것이 맞을까요?

서브 오브젝트들 중 에디터 상에서 보여지는 오브젝트를 asset 이라
명칭하는게 맞을까요?
그리고 그 asset은 여러 개의 서브 오브젝트들을 소유하고 있고요.
FullyLoad 함수는 그러한 asset들을 로딩 시키는 함수고요.
만약 맞다면 , FullyLoad 함수가 하는 일이 패키지에 있는 asset들을 로딩시키면서
각 asset들이 소유한 서브 오브젝트들도 모두 로딩 시키는 작업을 하는 걸까요?

그리고 강의 20:35 에서 에셋 간의 연결 작업을 할 때 직접 패키지를 불러서 동적으로 메모리를 할당하는 작업은 부화가 크다고 하셨는데요. 그런 경우가
StudentPackage->FullyLoad();
UStudent* TopStudent = FindObject<UStudent>(StudentPackage, *AssetName);
이럴 때를 말하는 걸까요?

이득우님의 프로필 이미지
이득우
지식공유자

네 asset의 정의가 참 모호한데요, 일반적으로는 물리 파일인 uasset과 콘텐츠 브라우저의 하나의 객체는 1:1로 대응됩니다. 하지만 1대 다로 대응되는 경우도 있는데, 이번 강의와 같은 사례겠지요. 이 상황에서 애셋을 uasset 확장자를 가진 물리 파일로 정의할지, 콘텐츠 브라우저에서 보이는 하나의 객체를 애셋으로 정의할지는 모호한 부분이 있습니다. 이전 설명은 콘텐츠 브라우저에서 보이는 하나의 객체를 애셋으로 생각해 답변을 드렸는데, 사실 위의 전제부터 정확하게 설정해야 혼동을 피할 것 같습니다. 다만 당장은 위의 답변에 대한 맥락을 그렇게 이해해주시면 되겠습니다.
나머지 답신 주신 내용을 보면 강의 내용은 잘 이해하신 걸로 보입니다.
FullyLoad 함수는 패키지에 있는 모든 오브젝트를 로딩하는 함수입니다. 소스코드의 설명은 다음과 같이 되어있으니 참고하시기 바랍니다.

/**
* Fully loads this package. Safe to call multiple times and won't clobber already loaded assets.
*/
void FullyLoad();

가장 이상적인 방법은 패키지에서 내가 쓰는 객체만 부분 로딩하는 것이지만, 강의 준비하면서 테스트해보니 깔끔하게 잘 안되는 경우가 종종 있더라고요. 실제 언리얼 소스코드에서도 FullyLoad 함수를 사용해서 원하는 객체를 안전하게 로딩하는 경우가 많습니다. 주석에서도 볼 수 있듯이 이미 로딩된 객체가 있어도 중복 차지하지 않으므로 여러번 호출해도 괜찮습니다.

강의 내용을 꼼꼼하게 잘 체크하셨네요.
화이팅입니다!~

0

안녕하세요, 임동재님. 인프런 AI 인턴입니다.

FullyLoad() 함수에 대한 질문은 언리얼 엔진의 패키지와 에셋 관리에 있어 중요한 부분입니다. 언리얼 엔진에서 하나의 패키지는 여러 개의 에셋을 포함할 수 있습니다. 따라서 FullyLoad() 메소드를 사용하면 해당 패키지에 포함된 모든 에셋을 메모리로 로드할 수 있는 것입니다. 이는 패키지가 담고 있는 모든 에셋을 한 번에 로드함으로써 사용 가능합니다.

애셋 간 연결 작업에서의 과부하는 여러 패키지나 에셋이 참조되어 있을 때, 각각의 에셋을 로드하는 과정에서 발생할 수 있는 문제입니다. 각 로딩 작업은 메모리와 성능에 영향을 줄 수 있고, 특히 큰 프로젝트에서는 의존성 관계를 고려하지 않고 무분별하게 로딩하면 성능 저하가 발생할 수 있습니다. 따라서 패키지 로딩 시 과도한 의존성 관계를 피하고 필요할 때만 로드하는 게 중요합니다.

아래는 동일 주제에 대한 이전 질문 답변을 참조할 수 있는 링크들입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

임동재님의 프로필 이미지
임동재

작성한 질문수

질문하기