일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 에러 메시지 쓰기
- 데비안한글
- chromebook
- vscode
- D2Coding
- UE4
- 프로그래머스
- 완주하지 못한 선수
- Extensions
- 리눅스한글
- 주석쓰기
- 개발자
- ELoadingPhase
- 알고리즘
- 단체사진찍기
- LoadingPhase
- fcitx
- crostini
- 숫자야구
- 크롬북
- unrealengine
- SimpleConfig
- 개발자의 글쓰기
- 영어 끝말잇기
- 큰수 만들기
- 숫자 야구
- codeserver
- unreal config
- code-server
- 전화번호 목록
- Today
- Total
Space Panda
[UE4] built-in module LoadingPhase 본문
1. 개요
회사에서 작업자들이 사용해야되는 에디터 모듈을 만들었던 적이 있습니다. Animblueprint에서 작동해야 되는 플러그인이었는데요. 플러그인에 들어가는 모듈들이 정상 작동 하는것을 저의 자리에서 확인하고 플러그인을 배포하여 사용하게 했습니다.
그런데 몇몇 프로젝트에서 정상적으로 작동하지 않는 문제가 발생하는 것이 었습니다. 며칠에 걸쳐서 문제의 원인을 찾아봤었는데요. 문제의 원인을 바로 LoadingPhase 때문이었습니다. 특정 모듈이 로딩되지 않은 시점에서 사용되서 나타난 문제였던거지요...(왜 몇몇 프로젝트에서만 문제가 발생했는지는 아직도 의문입니다...나중에 좀더 자세히 알아볼 예정입니다!!)
이러한 이유로 LoadingPhase에 대해서 자세히 찾아봤지만 엔진소스코드에 빌트인 되어있는 모듈들의 로드시점에 대해서는 자세한 정보가 없어서 직접 찾아서 정리해 보게 됬습니다.
2. LoadingPhase
로딩 페이즈 알아내기 위해서 제일 먼저 해야 됬던것은 역시나 어느곳(어느소스코드파일)에서 로드하는지를 알아내는 일이었습니다.
엔진 소스검색을 통해 답을 찾게 되었는데요. 아래의 소스 코드의 함수들에 답이 있었습니다.(4.25버전 기준)
- \Engine\Source\Runtime\Launch\Private\Launch.cpp
- GuardedMain()
- \Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp
- PreInit()
- PreInitPreStartupScreen()
- AppInit()
- PreInitPostStartupScreen()
- LoadPreInitModules()
- LoadStartupCoreModules()
- LoadStartupModules()
- Init()
- \Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp
- Init()
FModuleManager::LoadModule 로 시작되는 함수를 통해서 각각의 모듈을 로드하는데요. 자세한 사항을 원하시면 소스코드를 직접 보시는것을 추천드립니다.
아래는 함수 호출로 얽혀 있는 모듈 로드를 호출시점에 따라서 정리한 것입니다. 의사코드의 형태로 정리하였고 모듈의 이름 앞에는 "-"를 붙였습니다.
"ELoadingPhase::"의 경우 해당하는 시점에서 해당하는 LoadingPhase인 모든 플러그인 모듈들을 로드합니다.
간단하게, 위에서부터 아래의 순서로 로드가 진행된다고 이해하시면 됩니다.
(WITH_EDITOR, UE_BUILD_SHIPPING, WITH_ENGINE, UE_SERVER 등등 여러 매크로 분기로인해 로드되지 않는 모듈이 있을수도 있습니다만.... 순서는 변함 없습니다!!)
int32 GuardedMain()
{
FEngineLoop::PreInit()
{
FEngineLoop::PreInitPreStartupScreen()
{
FEngineLoop::LoadCoreModules()
{
- CoreUObject
}
FEngineLoop::AppInit()
{
- PIEPreviewDeviceProfileSelector
- ELoadingPhase::EarliestPossible
- ELoadingPhase::PostConfigInit
}
ELoadingPhase::PostSplashScreen
}
FEngineLoop::PreInitPostStartupScreen()
{
FEngineLoop::LoadPreInitModules()
{
- Engine
- Renderer
- AnimGraphRuntime
- SlateRHIRenderer
- Landscape
- RenderCore
- TextureCompressor
- AudioEditor
- AnimationModifiers
}
- ELoadingPhase::PreEarlyLoadingScreen
- AssetRegistry
- PIEPreviewDeviceProfileSelector
FEngineLoop::LoadStartupCoreModules()
{
- Core
- Networking
- Messaging
- MRMesh
- UnrealEd
- EditorStyle
- LandscapeEditorUtilities
- SlateCore
- Slate
- SlateReflector
- UMG
- MessageLog
- CollisionAnalyzer
- FunctionalTesting
- BehaviorTreeEditor
- GameplayTasksEditor
- AudioEditor
- StringTableEditor
- VREditor
- EnvironmentQueryEditor
- IntroTutorials
- Blutility
- Overlay
- MediaAssets
- ClothingSystemRuntimeNv
- ClothingSystemEditor
- PacketHandler
- NetworkReplayStreaming
}
ELoadingPhase::PreLoadingScreen
FEngineLoop::LoadStartupModules()
{
- ELoadingPhase::PreDefault
- ELoadingPhase::Default
- ELoadingPhase::PostDefault
}
- ELoadingPhase::PostEngineInit
- TaskGraph, ProfilerService
}
}
if(GIsEditor)
{
UEditorEngine::Init()
{
- Documentation
- WorkspaceMenuStructure
- MainFrame
- GammaUI
- OutputLog
- SourceControl
- TextureCompressor
- MeshUtilities
- MovieSceneTools
- ModuleUI
- Toolbox
- ClassViewer
- StructViewer
- ContentBrowser
- AssetTools
- GraphEditor
- KismetCompiler
- Kismet
- Persona
- AnimationBlueprintEditor
- LevelEditor
- MainFrame
- PropertyEditor
- EditorStyle
- PackagesDialog
- AssetRegistry
- DetailCustomizations
- ComponentVisualizers
- Layers
- AutomationWindow
- AutomationController
- DeviceManager
- ProfilerClient
- SessionFrontend
- ProjectLauncher
- SettingsEditor
- EditorSettingsViewer
- ProjectSettingsViewer
- Blutility
- XmlParser
- UndoHistory
- DeviceProfileEditor
- SourceCodeAccess
- BehaviorTreeEditor
- HardwareTargeting
- LocalizationDashboard
- MergeActors
- InputBindingEditor
- AudioEditor
- TimeManagementEditor
- EditorInteractiveToolsFramework
- TraceInsights
- IntroTutorials
- PListEditor
- EnvironmentQueryEditor
- LogVisualizer
- HotReload
- ClothPainter
- ViewportInteraction
- VREditor
- PixelInspectorModule
}
}
else
{
FEngineLoop::Init()
{
- SessionServices
- ELoadingPhase::PostEngineInit
- Media
- AutomationWorker
- AutomationController
- ProfilerClient
- SequenceRecorder
- SequenceRecorderSections
}
}
}
'Unreal Engine' 카테고리의 다른 글
[UE4] 간단한 데이터 저장을 위한 SimpleConfig 플러그인 (0) | 2021.07.06 |
---|---|
[UE4]C++ 코드로 언리얼 에디터용 툴(혹은 기능)을 만들때 유의 해야할점들 (0) | 2020.07.28 |
UE 4.23에서 마이크에서 들어오는 PCM 데이터 C++에서 접근하기 (0) | 2019.10.02 |