# PreInit ```cpp int32 FEngineLoop::PreInit(const TCHAR* CmdLine) { const int32 rv1 = PreInitPreStartupScreen(CmdLine); if (rv1 != 0) { PreInitContext.Cleanup(); return rv1; } const int32 rv2 = PreInitPostStartupScreen(CmdLine); if (rv2 != 0) { PreInitContext.Cleanup(); return rv2; } return 0; } ``` 当然,这个函数`FEngineLoop::PreInit`是Unreal Engine 4(UE4)初始化过程中非常关键的一步。这个函数负责引擎的预初始化,包括各种模块和设置。 代码做了以下几件事: 1. **调用`PreInitPreStartupScreen(CmdLine)`**: 这个函数执行==启动屏幕之前==的预初始化任务,并返回一个整数`rv1`作为状态代码。 2. **检查`rv1`**: 如果`rv1`不为0(意味着出现了错误或异常),则调用`PreInitContext.Cleanup();`来清理资源,并返回`rv1`退出。 3. **调用`PreInitPostStartupScreen(CmdLine)`**: 在==启动屏幕之后==执行更多预初始化工作,并返回一个整数`rv2`作为状态代码。 4. **检查`rv2`**: 如果`rv2`不为0(意味着出现了错误或异常),则调用`PreInitContext.Cleanup();`来清理资源,并返回`rv2`退出。 5. **返回0**: 如果一切顺利,函数返回0,表示预初始化成功完成。 从这个代码片段看出,`PreInit`函数分为两个主要阶段:`PreInitPreStartupScreen`和`PreInitPostStartupScreen`,它们分别在启动屏幕前后进行。每个阶段都有相应的错误检查和资源清理操作。 每一个`PreInitXXX`函数(如`PreInitPreStartupScreen`和`PreInitPostStartupScreen`)可能会做很多具体的初始化工作,比如模块加载、资源分配、设置读取等。这些函数的返回值用于表示初始化是否成功以及失败的级别(如果有)。 这里还使用了`PreInitContext.Cleanup();`,这个调用负责在发生错误时进行资源清理,这再次体现了RAII(资源获取即初始化)的编程模式,确保即使在错误情况下也能妥善处理资源。 其中==`PreInitContext`==是一个[[FEngineLoop]]的私有成员变量。类型是:[[FPreInitContext]]。 作为预初始化阶段的上下文信息。