inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

8강 아이템 시스템

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

218

제정민

작성한 질문수 8

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 를 처리하는 방법까지 분석해보진 못했습니다만,

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

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

unreal-engine ue-blueprint 언리얼-c++

답변 2

0

이득우

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

0

인프런 AI 인턴

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

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

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

  1. 장점:

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

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

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

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

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

무한맵 제작과정중에 GetWorld 가 Nullptr 을 반환합니다.

0

42

2

12강 행동트리에서 질문이 있습니다.

0

51

1

위젯 사이즈랑 위치 질문드려요.

0

81

3

행동트리의 데코레이션 관련하여 질문이 있습니다.

0

93

3

VS 2026 의 문제일까요?

0

477

2

에셋참조 블루프린트질문

0

67

2

애님 몽타주 콤보 관련질문

0

70

2

ThirdPerson CDO 에러가 생깁니다.

0

95

3

캐릭터가 움직이지 않습니다.

0

178

4

쿠킹 폴더 지정시 , Item 이외에는 지정하지 않는지 궁금합니다.

0

62

2

TSoftObjectPtr 를 사용했음에도, 메모리에 로드 됩니다.

0

93

2

7강에 나오는 생성자에 대해서 궁금합니다.

0

78

2

6강을 마무리하며 트레이스 채널 을 이해하지 못했습니다.

0

73

2

3강을 마무리 하며, 카메라가 움직이지 않습니다.

0

70

2

Use Controller Rotation 옵션값이 궁금합니다.

0

83

2

3강 입력 시스템 적용 중, 5.6 버전은 입력 매팅이 2개 입니다.

0

64

2

PlayerController 에 대헤 제가 잘못 이해한 것 같습니다.

0

78

2

13강 UpdateStat 부분에서 문제를 겪고 있습니다.

0

63

2

BP_PlayerController의 CustomEvent노드 이유가 궁금합니다.

0

64

1

콤포넌트 포인터 선언시 TObjectPtr<>과 UStaticMeshComponent* 차이점

0

72

2

CharacterMovementComponent의 RotationRate관련해서 질문이 있습니다.

0

113

2

언리얼 공부방법에 대해 질문드립니다.

0

85

2

4강 에서 이상한 그림자가 남습니다.

0

46

1

2강에서 카메라 회전안되시는분 참고

2

89

2