UE5 在启动流程中的 Exist

简介: 看过了 preInit,init,tick,到了声明周期的最后,结束退出阶段,Exit。在 Launch.cpp 中可以看到,定义了一个 EngineExit()函数,在 GuardedMain 函数的最后,代用的是 EditorExit() 函数

EngineExit

顾名思义,引擎退出函数,主要调用了 LaunchEngineLoop.cpp 内的 Exit 函数。
这个函数实在 GuardedMain 函数 比较前期的阶段就设置到一个 struct EngineLoopCleanupGuard 结构体的析构函数中了,应该是确保在 GuardedMain 函数结束后析构的时候自动调用 EngineExit

  1. 调用 CoreGlobals.cpp 内的 RequestEngineExit函数设置退出状态
  2. 调用 LaunchEngineLoop 内的 FEngineLoop::Exit() 函数
  3. 设置退出跟踪标签
  4. 清理待清除队列里的物体
  5. 移除插件
  6. 如果退出事件发生在 预加载场景还没有加载完的情况下,直接清理掉
  7. flush log,并关闭可视化log
  8. 关闭 编译管理器
  9. 关闭通信session
  10. 清理距离场队列
  11. cardRepresentation队列清理,这个队列 GTP 查询了解是全局光照做表面缓存用的
  12. 调用 UEngine::PreExit 预退出函数
  13. 释放音频设备管理器
  14. flush 加载缓冲区,并禁止再进行异步加载
  15. 确保 StreamingManager 关闭
  16. 关闭音频设备管理器
  17. 关闭 FSlateApplication系统的所有窗口
  18. 销毁字体服务
  19. 卸载 AssetTool 模块
  20. 卸载 WorldBrowser 模块
  21. 清理材质预编译请求
  22. 等待管线队列命令
  23. 调用 AppPreExit 函数
  24. 关闭物理引擎
  25. 关闭 Bulk Data 系统
  26. 关闭 IPackageResourceManager 系统
  27. 卸载 AssetRegistry 模块
  28. 关闭 渲染线程
  29. 关闭 着色器管线缓存
  30. 关闭全局着色器映射
  31. 关闭着色器核心库
  32. 关闭 IO 调度系统
  33. 关闭资源虚拟化系统
  34. 保存热重载状态
  35. 关闭 IStreamingManager
  36. 安全释放 GPUProfiler
  37. 销毁视频播放器
  38. 关闭多线程,并销毁线程池和大线程池,后台线程池
  39. 调用RHIExit()
  40. 关闭任务图形接口
  41. 关闭 taggedStorage
  42. 关闭窗口引用计数
  43. 关闭 FFrameProProfiler

EditorExit

引擎是否结束时通过 IsEngineExitRequested 来判断的,每一次 tick前都会判断 是否退出,如果退出,就会结束 tick 的循环逻辑, 然后向后走到 EditorExit,整个函数结束后,便会在释放 CleanupGuard 的时候,调用他的析构函数,然后调用前面的 EngineExit
EditorExit 函数位于 UnrealEdGlobals.cpp

  1. 打点性能分析和内存追踪
  2. 保存编辑器配置
  3. 保存最后一次的目录路径
  4. 处理并清除队列内的任务
  5. 调用 FUnrealEdMisc 内的 OnExit 函数
  6. 关闭 log 控制台

总结

GuardedMain 先通过 EngineLoopCleanupGuard 结构体的析构函数保证 EngineExit 的调用,使用 IsEngineExitRequested() 判断是否退出 tick 循环,函数尾部调用 EditorExit() ,最后通过 EngineLoopCleanupGuard 的析构调用 EngineExit()

  • EditorExit 主要是保存配置,关闭窗口
  • 引擎主体的各项功能和模块的逐步退出
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容