UE5 引擎入口文件
简介: 我其实是想从引擎的启动文件开始看,但确实找不到启动文件是哪个,拖 DeepSeek 的福,告说我在Source/Runtime/Launch 下是引擎的启动文件,不管正确与否,先从这里看看吧
Launch.Build 文件
在 Source/Runtime/Launch 模块下有一个 Launch.Build.cs 编译配置文件,就从它看是看吧
Launch 类扩展自 UBT 的 ModuleRules 类,用来配置构建时的依赖,这个 Launch 还被 Launch_VisionOS 继承了~~~~
Launch 需要
Launch.Build 文件里的一些常用属性
PrivateIncludePathModuleNames 一个list ,向其中添加要包含的私有模块的名称
PrivateDependencyModuleNames 一个list,当前模块以来的其他模块名称
这俩我有点疑问,Dependency 是要运行当前模块需要的模式,include 的难道是编译的时候直接把那个模块编译进去吗
这两个private属性都有对应的public属性
PrivateDefinitions 一个list ,编译时要用到的私有宏定义,文件里在这里判断了是否需要设置debug宏 也就是 UE_BUILD_DEVELOPMENT_WITH_DEBUGGAME=0 还是 1
C++居然还有私有宏定义一说吗,因为下面出现了一个公有宏定义
PublicDefinitions 一个 list,编译时要用到的公有宏定义,文件在这里判断了是否要依赖和开启 LauncherCheck,并且定义宏定义 WITH_LAUNCHERCHECK=0 还是 1
公有宏定义来了
DynamicallyLoadedModuleNames 一个 list,动态加载的模块名称
ReadOnlyTargetRules.bCompileAgainstEngine 的作用是是否启用对引擎核心模块的引用,如果为true 这引用,否则不引用
ReadOnlyTargetRules.bBuildEditor 指定是否编译 Editor
Launch.Build 文件的流程
- 起手添加需要包含的模块
- 添加需要依赖的模块
- 判断是否编译 Debug
- 是否需要依赖 LauncherCheck,如果需要则同时添加编译宏
- 添加非 Server 类型的依赖模块
- 添加非 Shipping 编译的依赖模块
- 添加渲染模块
- 如果编译依赖引擎核心模块,则添加相关依赖模块
- 是否添加 BuildEditor 编译,这里应该就是编译编辑器的部分,里面又加了很多的依赖和平台判断
- 判断平台并加入相关的依赖模块
- 判断是否需要合并模块,如果需要则定义宏 UE_MERGED_MODULES=1
Launch 文件
Launch/Public 下面放的都是 .h 头文件,Launch/Private 下面放的都是 .cpp 文件,我对 C++ 不是很熟悉,头文件应该就是一些定义和include,我就直接从 cpp 开始看吧
Private 下面有很多的平台目录,应该就是不同的平台的运行代码了
LaunchWindows.cpp
这个应该就是 windows 下程序的入口点了,它里面有一个 WinMain 函数,GPT 告诉我这个就是在 windows 下双击 exe 文件后windows会默认调用的入口函数
它里面就调用了两个函数 LaunchWindowsStartup 和 LaunchWindowsShutdown,并且在 LaunchWindowsStartup 逻辑的差不多最后的部分调用了 Launch.cpp 的 GuardedMain 函数,GuardedMain 函数内部是有一个无限循环的,所以在这个循环未被打断之前,程序就会一直循环。
Launch.cpp
文件内就七个方法
- test_main
- EnginePreInit
- EngineInit
- EngineTick // 无限循环体,它被包裹在一个 while 循环内
- EngienExit
- LaunchStaticShutdownAffteError
- GuardedMain
还有一个属性 FEngineLoop GEngineLoop 这个应该就是主要的循环刷新体了
Launch.capp 的 GuardedMain 被调用后,会依次调用上面的 2-5 个方法 在调用到 EngineTick 后会陷入循环,直到条件不成立。
到此引擎就靠 GEngineLoop.Tick(); 的无限执行进行刷新了
流程总结
- 双击执行 LaunchWindows 的 WinMain
- WinMain 调用 Launch 里的 GuardedMain
- GuardedMain 初始并设置 GEngineLoop,然后在 while 循环里调用 GEngineLoop.Tick()
本以为不好找,还好有 ChatGPT,确实方便啊。下一步主要就是看 GEngineLoop 了,不过有个疑问,虽然已经无限循环起来了,但是 编辑器的逻辑在哪里调用的呢,拿到也在 GEngineLoop 里吗,明天再看吧