Space Panda

[UE4] built-in module LoadingPhase 본문

Unreal Engine

[UE4] built-in module LoadingPhase

Space Panda 2020. 7. 28. 14:21

1.  개요

회사에서 작업자들이 사용해야되는 에디터 모듈을 만들었던 적이 있습니다. Animblueprint에서 작동해야 되는 플러그인이었는데요. 플러그인에 들어가는 모듈들이 정상 작동 하는것을 저의 자리에서 확인하고 플러그인을 배포하여 사용하게 했습니다.

그런데 몇몇 프로젝트에서 정상적으로 작동하지 않는 문제가 발생하는 것이 었습니다. 며칠에 걸쳐서 문제의 원인을 찾아봤었는데요. 문제의 원인을 바로 LoadingPhase 때문이었습니다. 특정 모듈이 로딩되지 않은 시점에서 사용되서 나타난 문제였던거지요...(왜 몇몇 프로젝트에서만 문제가 발생했는지는 아직도 의문입니다...나중에 좀더 자세히 알아볼 예정입니다!!)

이러한 이유로 LoadingPhase에 대해서 자세히 찾아봤지만 엔진소스코드에 빌트인 되어있는 모듈들의 로드시점에 대해서는 자세한 정보가 없어서 직접 찾아서 정리해 보게 됬습니다.

 

2. LoadingPhase

로딩 페이즈 알아내기 위해서 제일 먼저 해야 됬던것은 역시나 어느곳(어느소스코드파일)에서 로드하는지를 알아내는 일이었습니다. 

엔진 소스검색을 통해 답을 찾게 되었는데요. 아래의 소스 코드의 함수들에 답이 있었습니다.(4.25버전 기준)

 

  1. \Engine\Source\Runtime\Launch\Private\Launch.cpp
    • GuardedMain()
  2. \Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp
    • PreInit()
    • PreInitPreStartupScreen()
    • AppInit()
    • PreInitPostStartupScreen()
    • LoadPreInitModules()
    • LoadStartupCoreModules()
    • LoadStartupModules()
    • Init()
  3. \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
        }
    }
}
Comments