简介: 看过了 preInit,init,tick,到了声明周期的最后,结束退出阶段,Exit。在 Launch.cpp 中可以看到,定义了一个 EngineExit()函数,在 GuardedMain 函数的最后,代用的是 EditorExit() 函数
EngineExit
顾名思义,引擎退出函数,主要调用了 LaunchEngineLoop.cpp 内的 Exit 函数。
这个函数实在 GuardedMain 函数 比较前期的阶段就设置到一个 struct EngineLoopCleanupGuard 结构体的析构函数中了,应该是确保在 GuardedMain 函数结束后析构的时候自动调用 EngineExit
- 调用 CoreGlobals.cpp 内的 RequestEngineExit函数设置退出状态
- 调用 LaunchEngineLoop 内的 FEngineLoop::Exit() 函数
- 设置退出跟踪标签
- 清理待清除队列里的物体
- 移除插件
- 如果退出事件发生在 预加载场景还没有加载完的情况下,直接清理掉
- flush log,并关闭可视化log
- 关闭 编译管理器
- 关闭通信session
- 清理距离场队列
- cardRepresentation队列清理,这个队列 GTP 查询了解是全局光照做表面缓存用的
- 调用 UEngine::PreExit 预退出函数
- 释放音频设备管理器
- flush 加载缓冲区,并禁止再进行异步加载
- 确保 StreamingManager 关闭
- 关闭音频设备管理器
- 关闭 FSlateApplication系统的所有窗口
- 销毁字体服务
- 卸载 AssetTool 模块
- 卸载 WorldBrowser 模块
- 清理材质预编译请求
- 等待管线队列命令
- 调用 AppPreExit 函数
- 关闭物理引擎
- 关闭 Bulk Data 系统
- 关闭 IPackageResourceManager 系统
- 卸载 AssetRegistry 模块
- 关闭 渲染线程
- 关闭 着色器管线缓存
- 关闭全局着色器映射
- 关闭着色器核心库
- 关闭 IO 调度系统
- 关闭资源虚拟化系统
- 保存热重载状态
- 关闭 IStreamingManager
- 安全释放 GPUProfiler
- 销毁视频播放器
- 关闭多线程,并销毁线程池和大线程池,后台线程池
- 调用RHIExit()
- 关闭任务图形接口
- 关闭 taggedStorage
- 关闭窗口引用计数
- 关闭 FFrameProProfiler
EditorExit
引擎是否结束时通过 IsEngineExitRequested 来判断的,每一次 tick前都会判断 是否退出,如果退出,就会结束 tick 的循环逻辑, 然后向后走到 EditorExit,整个函数结束后,便会在释放 CleanupGuard 的时候,调用他的析构函数,然后调用前面的 EngineExit
EditorExit 函数位于 UnrealEdGlobals.cpp 内
- 打点性能分析和内存追踪
- 保存编辑器配置
- 保存最后一次的目录路径
- 处理并清除队列内的任务
- 调用 FUnrealEdMisc 内的 OnExit 函数
- 关闭 log 控制台
总结
在 GuardedMain 先通过 EngineLoopCleanupGuard 结构体的析构函数保证 EngineExit 的调用,使用 IsEngineExitRequested() 判断是否退出 tick 循环,函数尾部调用 EditorExit() ,最后通过 EngineLoopCleanupGuard 的析构调用 EngineExit()
- EditorExit 主要是保存配置,关闭窗口
- 引擎主体的各项功能和模块的逐步退出