강의

멘토링

로드맵

Inflearn brand logo image

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

제정민님의 프로필 이미지
제정민

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

8강 아이템 시스템

비동기 로딩 질문 드립니다.

작성

·

140

·

수정됨

0

안녕하세요. 유익한 강의 감사합니다.

 

 

TSoftObjectPtr 통한 약참조된 객체의 경우 비동기 로딩 코드 문의 드립니다.

 

UABWeaponItemData* WeaponItemData = Cast<UABWeaponItemData>(InItemData);

if (WeaponItemData)

{

if (WeaponItemData->WeaponMesh.IsPending())

{

WeaponItemData->WeaponMesh.LoadSynchronous();

}

Weapon->SetSkeletalMesh(WeaponItemData->WeaponMesh.Get());

}

 

위에 것이 원래 코드인데, 소프트 참조를 적극 활용할 경우, 런타임에 지연된 로딩을 많이 사용하게 되면 hitch 가 많이 발생할까 싶어 비동기로딩 방법을 찾아보았습니다 ( 제가 짠 건 아니고, 코파일럿 도움 )

 

if (WeaponItemData->WeaponMesh.IsPending())

{

// 비동기 로드 시작

WeaponItemData->WeaponMesh.LoadAsync([this](UObject* LoadedObject)

{

// 로드 완료 후 처리

USkeletalMesh* LoadedMesh = Cast<USkeletalMesh>(LoadedObject);

if (LoadedMesh)

{

Weapon->SetSkeletalMesh(LoadedMesh);

}

});

}

else

{

// 이미 로드된 경우 바로 설정

Weapon->SetSkeletalMesh(WeaponItemData->WeaponMesh.Get());

}

언리얼이 내부적으로 LoadAsync 를 처리하는 방법까지 분석해보진 못했습니다만,

여러 틱에 나눠 시분할로 나눠서 로딩하는 방법인가? 짐작만 하고 있습니다.

이런 경우 비동기 로딩을 하는 게 일반적으로 더 나은 방법일 지 문의 드립니다.

답변 2

0

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

비동기 로드는 틱은 아니고, 애셋 로드를 담당하는 스레드가 작업을 완료하면 게임 스레드의 콜백을 실행합니다. 언리얼 엔진은 버전에 따라 코드가 다르기 때문에 AI의 도움을 받더라도 최종 코드는 직접 작성 하시는 것을 권장 합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 제정민님.

언리얼 엔진에서의 비동기 로딩은 개발자가 게임의 성능 부하를 최적화하고 로딩 시 발생하는 끊김 현상(hitch)을 최소화하기 위해 많이 사용하는 기법입니다. 특히, TSoftObjectPtr을 통한 객체 로딩 시 비동기를 사용하면 런타임에서의 성능 저하를 줄이는 데 큰 도움이 됩니다.

질문에서 언급하신 코드와 같이 LoadAsync()를 사용하는 비동기 로딩은, 언리얼 엔진 내부에서 특정 에셋 로딩을 여러 프레임에 나눠 실행하는 방식으로, 메인 스레드를 차단하지 않고 백그라운드에서 로드를 진행합니다. 이는 게임이 실행 중일 때 로드해야 하는 리소스가 많은 경우, 즉시 로딩(LoadSynchronous)을 사용하는 것보다 게임 성능 측면에서 이점이 있습니다. 다음은 비동기 로딩의 일반적인 장점과 고려사항입니다:

  1. 장점:

    • 프레임 속도 유지: 비동기 로딩은 메인 게임 루프를 차단하지 않아, 게임이 부드럽게 진행되도록 합니다.
    • 유연한 개발: 필요에 따라 로딩 시점을 조절할 수 있습니다. 예를 들어, 플레이어의 시야에 들어오기 전에 필요한 에셋을 미리 로드할 수 있습니다.
  2. 고려사항:

    • 로드 완료 후 처리 로직: 로드가 완료된 후에 처리해야 하는 추가적인 로직을 미리 잘 설계해야 합니다. 즉시 사용하려는 에셋이 아닌 경우, 로드 완료 확인이 필요합니다.
    • 에셋 관리 계획: 비동기 로딩이 완료되기 전의 에셋 접근을 피할 수 있도록 예외 처리가 필요할 수 있습니다.

비동기 로딩을 할 때 중요한 부분 중 하나는 에셋이 언제 사용할 준비가 되었는지를 정확하게 확인하는 것입니다. 이에 따라 로딩 대기 상태로 게임의 흐름이 끊기지 않도록 해야 합니다.

유사한 주제로 다룬 다른 질문을 참고하여 좀 더 심도 있는 내용을 확인하실 수 있습니다:

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

제정민님의 프로필 이미지
제정민

작성한 질문수

질문하기