自古以来所有的游戏引擎都分为三大阶段:Init、Loop、Exit。 UE4也不例外。
首先找到带有入口函数的文件:Runtime/Launch/Private/XXXX/LaunchXXXX.cpp。 Windows 平台将 XXXX 替换为 Windows。
这个文件实现了一个 GuardedMainWrapper 函数。顾名思义,这个函数是GuardedMain的一个包装器,用trycatch包装GuardedMain。
GuardedMain 位于:Runtime/Launch/Private/Launch.cpp。整个引擎分为四大阶段:引擎预初始化(EnginePreInit)、引擎初始化(EngineInit)、引擎循环(EngineLoop)、引擎退出(EngineExit)。
通过FEngineLoop对象的PreInit、Init、Tick、Exit实现游戏引擎初始化失败,见Runtime/Launch/Private/LaunchEngineLoop.cpp。
PreInit阶段主要任务有:日志函数启动、线程池启动、预初始化相关模块加载、应用级初始化(ini-configured buffer加载、TaskGraph启动)、RHI初始化、异步IO系统初始化、平台特性模块初始化、游戏物理初始化、流管理初始化、Slate应用创建、渲染线程启动、加载启动模块。
在Init阶段,主要做:引擎对象的构造,引擎的命令行控制字处理游戏引擎初始化失败,时间初始化,引擎的具体初始化。
主要在Tick节点完成:开始帧(请求渲染线程的BeginFrame命令,更新时间和进程最大更新率,更新FPS图表),重启延迟更新(请求渲染线程的ResetDeferredUpdates,消息泵,引擎的具体周期,Shader的异步编译处理)UI界面,结束帧(请求渲染线程的EndFrame命令)。
主要在Exit中完成:应用预退出(线程池销毁、Shader编译管理关闭、在线子系统关闭、结束游戏物理、释放粒子顶点工厂池、释放运动模糊、停止渲染线程、RHI exits,关闭所有模块,关闭TaskGraph,关闭流管理,关闭异步IO系统。
最后会调用一个AppExit,主要在AppExit中完成:ini配置缓冲区的退出和Log的退出。