UE4的入口函数文件:Runtime/Launch/Private/XXXX/LaunchXXXX.cpp。
Windows平台就将XXXX替换成Windows,即:LaunchWindows.cpp
Windows平台入口函数为:WinMain,它里面会调用引擎入口函数GuardedMain来初始化引擎流程。
UE4的初始化流程文件:Runtime/Launch/Private/Launch.cpp。
引擎入口函数为:GuardedMain
引擎四个大阶段:引擎预初始(EnginePreInit),引擎初始(EngineInit),引擎循环(EngineLoop),引擎退出(EngineExit)。
// 全局的引擎主循环对象FEngineLoop GEngineLoop;
int32 EnginePreInit( const TCHAR* CmdLine )
{
int32 ErrorLevel = GEngineLoop.PreInit( CmdLine );
return( ErrorLevel );
}
int32 EngineInit()
{
int32 ErrorLevel = GEngineLoop.Init();
return( ErrorLevel );
}
void EngineTick( void )
{
GEngineLoop.Tick();
}
void EngineExit( void )
{
GIsRequestingExit = true;
GEngineLoop.Exit();
}
#if PLATFORM_WINDOWSint32 GuardedMain( const TCHAR* CmdLine, HINSTANCE hInInstance, HINSTANCE hPrevInstance, int32 nCmdShow )
#elseint32 GuardedMain( const TCHAR* CmdLine )
#endif{
// make sure GEngineLoop::Exit() is always called. struct EngineLoopCleanupGuard
{
~EngineLoopCleanupGuard()
{
// 引擎退出 EngineExit();
}
} CleanupGuard;
// 引擎预初始化 int32 ErrorLevel = EnginePreInit( CmdLine );
if ( ErrorLevel != 0 || GIsRequestingExit )
{
return ErrorLevel;
}
// 引擎初始化 ErrorLevel = EngineInit();
while( !GIsRequestingExit )
{
// 引擎循环 EngineTick();
}
return ErrorLevel;
}
UE4的主引擎循环实现文件:Runtime/Launch/Private/LaunchEngineLoop.cpp。
引擎预初始(PreInit):日志功能的启动,线程池的启动,加载了预初始相关的模块,应用程序层面的初始化(ini配置的缓冲的加载,TaskGraph的启动),RHI初始化,异步IO系统初始化,平台特征模块初始化,游戏物理的初始化,流管理初始化,Slate应用程序的创建,启动渲染线程,加载启动模块。
引擎初始(Init):引擎的对象的构造,引擎的命令行控制字处理,时间初始化,引擎的具体初始化。
引擎循环(Tick):开始帧(请求渲染线程的BeginFrame命令、更新时间以及处理最大更新率、更新FPS图表),重启延迟更新(请求渲染线程的ResetDeferredUpdates、消息泵,引擎的具体循环、Shader的异步编译处理),结束帧(请求渲染线程的EndFrame命令)。
引擎退出(Exit):应用程序预退出(线程池的销毁、Shader编译管理的关闭、在线子系统的关闭、结束游戏物理,粒子顶点工厂池释放,运动模糊释放,停止渲染线程,RHI退出,关闭所有的模块,TaskGraph关闭,流管理关闭,异步IO系统关闭。
应用程序初始化(AppInit)
应用程序预退出(AppPreExit)
应用程序退出(AppExit):ini配置缓冲的退出,Log的退出。
// FEngineLoop的公共接口,因此我们可以从编辑器或编辑器代码调用它class IEngineLoop
{
public:
virtual int32 Init() = 0;
virtual void Tick() = 0;
/** Removes references to any objects pending cleanup by deleting them. */
virtual void ClearPendingCleanupObjects() = 0;
};
class FEngineLoop
#if WITH_ENGINE : public IEngineLoop
#endif{
public:
// 预初始化主循环,并从标准ArgC/ArgV from main()生成命令行。 int32 PreInit(int32 ArgC, TCHAR* ArgV[], const TCHAR* AdditionalCommandline = nullptr);
// 预初始化主循环-解析命令行,设置GIsEditor等。 int32 PreInit(const TCHAR* CmdLine);
// 初始化主循环:引擎的对象的构造,引擎的命令行控制字处理,时间初始化,引擎的具体初始化。 virtual int32 Init() override;
// 推进主循环 virtual void Tick() override;
// 关闭主循环 void Exit();
public:
// 初始化应用程序。 static bool AppInit();
// 准备关闭应用程序。 // 只有在非错误退出期间,该函数才会从保护退出代码中调用。 static void AppPreExit();
// 关闭应用程序。 // 此函数称为外部保护退出代码,在所有退出(包括错误退出)中。 static void AppExit();
};