UE5 在启动流程中的 Init 3

简介: LaunchEngineLoop.cpp 内的 Init() 里面有调用了 GEngine 的 Init,而这个 GEngine 才是真正的引擎实例。这个 GEngine 又根据是不是 eidtor 来决定具体实例化为 UGameEngine 还是 UUnrealEdEngine

  • UGameEngine 继承自 UEngine 继承自 UObject
  • UUnrealEdEngine 继承自 UEditorEngine 继承自 UEngine 继承自 UObject
    它们的父类也都有自己的 Init ,套娃啊,接下来我计划两个都捋一遍

UEditorEngine::Init(IEngineLoop* InEngineLoop)

此类位于 EditorEngine.cpp 文件内,在 UUnrealEdEngine 内的 Init 开始出就调用的这方法,所以我先捋它

  1. 使用 DECLARE_SCOPE_CYCLE_COUNTER 开启CPU周期计数统计

  2. 绑定 UEditorEngine::OnModalMessageDialogFCoreDelegates::ModalMessageDialog

  3. 绑定 UEditorEngine::OnShouldLoadOnTopFCoreUObjectDelegates::ShouldLoadOnTop

  4. 绑定 PreWorldOriginOffsetFCoreDelegates

  5. 绑定 OnAssetLoadedFCoreUObjectDelegates

  6. 绑定 OnLevelAddedToWorldOnLevelRemovedFromWorldFWorldDelegates

  7. 绑定 OnAssetCreatedIAssetRegistry

  8. FEditorDelegates 的三个阶段添加 Lambda

  • BeginPIE (Begin Play In Editor)
  • PrePIEEnded (Pre Play In Editor Ended)
  • EndPIE (End Play In Editor)
  1. 检查引擎是否为原厂版本 UpdateIsVanillaProduct()

  2. FSourceCodeNavigation 注册新添加模块时的 lambda

  3. 初始化 Editor,在这个初始化函数里调用了 UEngien的Init,这个函数调用在 UGameEngine 类里也有调用,所以放在后文在写吧

  4. LoadEditorFeatureLevel();加载 Editor 特性关卡

  5. CreateTrans() 创建并启动一个编辑事务,实现对场景或资源的 Redo/Undo

  6. 加载默认的 Editor 模块

  7. UModel 设置全局的 BSP 纹素缩放

  8. 加载并应用游戏用户设置

  9. 获取默认编辑器 style

  10. FEditorCommandLineUtils 初始化 Eidtor CommandLine 工具

  11. 检查丢失的高级渲染 Require

  12. 标记 bIsInitialized=true

UUnrealEdEngine::Init(IEngineLoop* InEngineLoop)

此类的具体逻辑位于 UnrealEdEngine.cpp 文件内

  1. 调用上方基类 UEditorEngine 的Init

  2. 将 自定义编辑器元素(菜单、工具栏、命令、面板等)注册到引擎框架中

  3. 重建地图模版数据

  4. 检查磁盘剩余空间

  5. FSourceCodeNavigation 代码导航初始化

  6. PackageAutoSaver 重置并加载文件

  7. 检查 GEditorSettingsIni 位置文件是否为空,如果为空则创建一个新的 性能监控实例

  8. UPackage 添加 PackageDirtyStateChangedEvent 回调函数

  9. 初始化 Content 路径并检查写入权限

  10. 获取 FDirectoryWatcherModule 模块实例的指针

  11. FPackageName 添加新的 Content 路径的挂在和写在监听

  12. FCoreUObjectDelegates 添加 OnPostGarbageCollect 监听

  13. 添加其它监听,例如,OnColorPickerChanged、OnPreWindowMessage、OnPostWindowMessage、OnHISMTreeBuilt、OnEditorElementSelectionPtrChanged

  14. FSnappingUtils 编辑器吸附工具初始化

  15. AVolume 向 VolumeShapeChangedDelgate 添加形状变动事件

  16. 检查并加载所有需要完全加的 Package

  17. FSpriteCategoryInfo 精灵分类索引重建

  18. UAutoReimportManager 自动重新导入管理器 初始化

  19. 注册自定义面板设置

  • BlueprintEditorSettings
  • BlueprintEditorProjectSettings
  • EditorLoadingSavingSettings
  • GameMapsSettings
  • LevelEditorPlaySettings
  • ProjectPackagingSettings
  • LevelEditorPlayNetworkEmulationSettings
  1. 获取 ISettingsModule 模块

  2. 绑定 导入、导出 事件

  3. 获取 FPropertyEditorModule 模块

  4. 非 CMD 模式下 设置编辑器进行 ID 的环境变量

  5. 获取 UEditorExperimentalSettings

  6. 获取 UCookerSettings

  7. 设置 CookerServer 的实例和初始化

  8. 创建 FExternalCookOnTheFlyServer 的实例

  9. 根据命令行参数 nomcp 设置子进程的 命令行

  10. 添加主框架打开后的 卡顿检测系统

  11. 注册 编辑器关闭时的 lambda 函数

总结

两个类加起来的内容还可以不是很多
罗列一下新东西

  • IAssetRegistry 资源元数据管理系统核心接口
  • FSourceCodeNavigation 源代码与编辑器之间的导航工具类
  • FPackageAutoSaver 自动保存未持久化包的工具
  • USelection 编辑器中选择状态管理器
  • FSnappingUtils 吸附工具
  • AVolume 一个Actor 实例类,在场景中定义一个3D空间区域,就是体积
  • FSpriteCategoryInfo 精灵片分类信息
  • FPropertyEditorModule 属性编辑器模块
  • UCookerSettings 烘焙设置
  • FExternalCookOnTheFlyServer 分布式烘焙,及动态加载核心类 (COTF)
  • UE::FStallDetector 初始化卡顿(Stall)检测系统
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容