位于:`\Engine\Souce\Runtime\Launch\Public\LaunchEngineLoop.h` ```cpp struct FPreInitContext { bool bDumpEarlyConfigReads = false; bool bDumpEarlyPakFileReads = false; bool bForceQuitAfterEarlyReads = false; bool bWithConfigPatching = false; bool bDisableDisregardForGC = false; bool bHasEditorToken = false; bool bIsRegularClient = false; bool bTokenDoesNotHaveDash = false; FString Token; const TCHAR* CommandletCommandLine = nullptr; TCHAR* CommandLineCopy = nullptr; FScopedSlowTask* SlowTaskPtr = nullptr; void Cleanup(); #if WITH_ENGINE && !UE_SERVER TSharedPtr<FSlateRenderer> SlateRenderer; #endif // WITH_ENGINE && !UE_SERVER }; ``` ### 基础成员变量 1. **布尔型成员变量**: 大部分的布尔型成员变量(如`bDumpEarlyConfigReads`, `bDumpEarlyPakFileReads`等)应该是用于控制特定的引擎行为或特性。这些通常在启动或初始化过程中根据命令行参数或配置文件进行设置。 2. **`Token`**: 这个`FString`可能用于存储某种标识符或令牌,可能用于权限验证、功能开关等。 3. **`CommandletCommandLine`和`CommandLineCopy`**: 这两个指向`TCHAR`类型的指针可能用于存储或传递命令行参数。`CommandletCommandLine`可能是一个只读的原始指针,而`CommandLineCopy`可能是一个可修改的副本。 4. **`SlowTaskPtr`**: 这个指向`FScopedSlowTask`的指针可能用于追踪或报告一个长时间运行的任务的进度。 ### 条件编译 5. **`#if WITH_ENGINE && !UE_SERVER`**: 这部分代码只在某些编译条件下有效,特别是当编译包含引擎但不是服务器版本时。 - **`SlateRenderer`**: 这是一个智能指针(`TSharedPtr`),指向一个`FSlateRenderer`对象。Slate是Unreal Engine用于创建用户界面的框架,`FSlateRenderer`可能是用于渲染这些界面。 ### 方法 6. **`Cleanup()`**: 这个方法很可能是用于释放`FPreInitContext`中分配的任何资源,或者重置其状态。在前面看到的`FEngineLoop::PreInit`函数中,如果任何预初始化步骤失败,就会调用这个`Cleanup()`方法。 综合以上,`FPreInitContext`是一个上下文结构,它存储了引擎预初始化阶段需要的各种设置和状态信息。这些信息可以用于控制引擎的具体行为,处理错误,以及进行资源管理。 这种结构的设计是一个很好的示例,展示了如何将与某一阶段(在这里是预初始化)相关的所有信息和行为封装在一个单独的结构中。这有助于代码的模块化和可维护性。