ue4如何恢复初始状态_UE4 引擎剖析 - 游戏的初始化流程

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();

};

你可能感兴趣的:(ue4如何恢复初始状态)