UE5 引擎入口文件

2025-04-15  本文已影响0人  暴走TA

简介: 我其实是想从引擎的启动文件开始看,但确实找不到启动文件是哪个,拖 DeepSeek 的福,告说我在Source/Runtime/Launch 下是引擎的启动文件,不管正确与否,先从这里看看吧

Launch.Build 文件

在 Source/Runtime/Launch 模块下有一个 Launch.Build.cs 编译配置文件,就从它看是看吧

Launch 类扩展自 UBTModuleRules 类,用来配置构建时的依赖,这个 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 文件的流程

  1. 起手添加需要包含的模块
  2. 添加需要依赖的模块
  3. 判断是否编译 Debug
  4. 是否需要依赖 LauncherCheck,如果需要则同时添加编译宏
  5. 添加非 Server 类型的依赖模块
  6. 添加非 Shipping 编译的依赖模块
  7. 添加渲染模块
  8. 如果编译依赖引擎核心模块,则添加相关依赖模块
  9. 是否添加 BuildEditor 编译,这里应该就是编译编辑器的部分,里面又加了很多的依赖和平台判断
  10. 判断平台并加入相关的依赖模块
  11. 判断是否需要合并模块,如果需要则定义宏 UE_MERGED_MODULES=1

Launch 文件

Launch/Public 下面放的都是 .h 头文件,Launch/Private 下面放的都是 .cpp 文件,我对 C++ 不是很熟悉,头文件应该就是一些定义和include,我就直接从 cpp 开始看吧
Private 下面有很多的平台目录,应该就是不同的平台的运行代码了

LaunchWindows.cpp

这个应该就是 windows 下程序的入口点了,它里面有一个 WinMain 函数,GPT 告诉我这个就是在 windows 下双击 exe 文件后windows会默认调用的入口函数
它里面就调用了两个函数 LaunchWindowsStartupLaunchWindowsShutdown,并且在 LaunchWindowsStartup 逻辑的差不多最后的部分调用了 Launch.cppGuardedMain 函数,GuardedMain 函数内部是有一个无限循环的,所以在这个循环未被打断之前,程序就会一直循环。

Launch.cpp

文件内就七个方法

  1. test_main
  2. EnginePreInit
  3. EngineInit
  4. EngineTick // 无限循环体,它被包裹在一个 while 循环内
  5. EngienExit
  6. LaunchStaticShutdownAffteError
  7. GuardedMain
    还有一个属性 FEngineLoop GEngineLoop 这个应该就是主要的循环刷新体了

Launch.capp 的 GuardedMain 被调用后,会依次调用上面的 2-5 个方法 在调用到 EngineTick 后会陷入循环,直到条件不成立。

到此引擎就靠 GEngineLoop.Tick(); 的无限执行进行刷新了

流程总结

  1. 双击执行 LaunchWindows 的 WinMain
  2. WinMain 调用 Launch 里的 GuardedMain
  3. GuardedMain 初始并设置 GEngineLoop,然后在 while 循环里调用 GEngineLoop.Tick()

本以为不好找,还好有 ChatGPT,确实方便啊。下一步主要就是看 GEngineLoop 了,不过有个疑问,虽然已经无限循环起来了,但是 编辑器的逻辑在哪里调用的呢,拿到也在 GEngineLoop 里吗,明天再看吧

上一篇 下一篇

猜你喜欢

热点阅读