UE5 源码学习 初始化

跟着

https://www.cnblogs.com/timlly/p/13877623.html

学习

入口函数

UnrealEngine\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp

WinMain 入口

int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ char* pCmdLine, _In_ int32 nCmdShow)
{int32 Result = LaunchWindowsStartup(hInInstance, hPrevInstance, pCmdLine, nCmdShow, nullptr);LaunchWindowsShutdown();return Result;
}

然后进入 LAUNCH_API int32 LaunchWindowsStartup( HINSTANCE hInInstance, HINSTANCE hPrevInstance, char*, int32 nCmdShow, const TCHAR* CmdLine )

似乎是经过一些 debugger

然后进入 GuardedMain

UnrealEngine\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp

	// When we're running embedded, assume that the outer application is going to be handling crash reporting
#if UE_BUILD_DEBUGif (GUELibraryOverrideSettings.bIsEmbedded || !GAlwaysReportCrash)
#elseif (GUELibraryOverrideSettings.bIsEmbedded || bNoExceptionHandler || (bIsDebuggerPresent && !GAlwaysReportCrash))
#endif{// Don't use exception handling when a debugger is attached to exactly trap the crash. This does NOT check// whether we are the first instance or not!ErrorLevel = GuardedMain( CmdLine );}

预初始化

然后就进入 EnginePreInit

UnrealEngine\Engine\Source\Runtime\Launch\Private\Launch.cpp

	int32 ErrorLevel = EnginePreInit( CmdLine );

然后是

UnrealEngine\Engine\Source\Runtime\Launch\Private\Launch.cpp

/** * PreInits the engine loop */
int32 EnginePreInit( const TCHAR* CmdLine )
{int32 ErrorLevel = GEngineLoop.PreInit( CmdLine );return( ErrorLevel );
}

然后是

UnrealEngine\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp

int32 FEngineLoop::PreInit(const TCHAR* CmdLine)
{
#if UE_ENABLE_ARRAY_SLACK_TRACKING// Any array allocations before this point won't have array slack tracking, although subsequent reallocations of existing arrays// will gain tracking if that occurs.  The goal is to filter out startup constructors which run before Main, which introduce a// ton of noise into slack reports.  Especially the roughly 30,000 static FString constructors in the code base, each with a// unique call stack, and all having a little bit of slack due to malloc bucket size rounding.ArraySlackTrackInit();
#endifconst 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;
}

然后跳到了 int32 FEngineLoop::PreInitPreStartupScreen(const TCHAR* CmdLine)

不断步进,然后看到一个问题

#if WITH_ENGINE// Add the default engine shader dirAddShaderSourceDirectoryMapping(TEXT("/Engine"), FPlatformProcess::ShaderDir());

UnrealEngine\Engine\Source\Runtime\RenderCore\Private\ShaderCore.cpp

前面大部分都是在检查

void AddShaderSourceDirectoryMapping(const FString& VirtualShaderDirectory, const FString& RealShaderDirectory)
{...GShaderSourceDirectoryMappings.Add(VirtualShaderDirectory, RealShaderDirectory);
}

最终也只是把它放到一个 map 里面

UnrealEngine\Engine\Source\Runtime\RenderCore\Private\ShaderCore.cpp

/** Global map of virtual file path to physical file paths */
static TMap<FString, FString> GShaderSourceDirectoryMappings;

然后后面还有调用 AddShaderSourceDirectoryMapping

然后是加载 module

UnrealEngine\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp

	// Load Core modules required for everything else to work (needs to be loaded before InitializeRenderingCVarsCaching){SCOPED_BOOT_TIMING("LoadCoreModules");if (!LoadCoreModules()){UE_LOG(LogInit, Error, TEXT("Failed to load Core modules."));return 1;}}...{SCOPED_BOOT_TIMING("LoadPreInitModules");LoadPreInitModules();}

加载 module 都是用的 FModuleManager::Get().LoadModule

UnrealEngine\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp

部分代码

void FEngineLoop::LoadPreInitModules()
{DECLARE_SCOPE_CYCLE_COUNTER(TEXT("Loading PreInit Modules"), STAT_PreInitModules, STATGROUP_LoadTime);// GGetMapNameDelegate is initialized here
#if WITH_ENGINEFModuleManager::Get().LoadModule(TEXT("Engine"));FModuleManager::Get().LoadModule(TEXT("Renderer"));FModuleManager::Get().LoadModule(TEXT("AnimGraphRuntime"));FPlatformApplicationMisc::LoadPreInitModules();

之后似乎我也看不懂

于是回到 int32 FEngineLoop::PreInit(const TCHAR* CmdLine)

奇怪的是,我在 const int32 rv2 = PreInitPostStartupScreen(CmdLine); 这里加了断点,但是直到选择项目的界面出现了,也没有触发

但是毫无疑问,我从 int32 ErrorLevel = EnginePreInit( CmdLine ); 里面退出来之后,接下来还是继续留在 int32 GuardedMain( const TCHAR* CmdLine ) 里面,并且这个时候也没进到项目选择的界面

所以……那个问题就不管了

然后是编辑器初始化

UnrealEngine\Engine\Source\Runtime\Launch\Private\Launch.cpp

#if WITH_EDITORif (GIsEditor){ErrorLevel = EditorInit(GEngineLoop);}else
#endif{ErrorLevel = EngineInit();}}

初始化这里似乎不应该深究

我看 UE 官方的 PPT 都说很多人讨厌臃肿的初始化hhh

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…

element 按钮变形 el-button样式异常

什么都没动&#xff0c;element UI的按钮变形了&#xff0c;莫名其妙&#xff0c;连官网的也变形了&#xff0c;换了其它浏览器又正常&#xff0c; 难道这是element UI的问题&#xff1f;NO&#xff0c;是浏览器的插件影响到了&#xff01;去扩展插件里面一个个关闭扩展&#x…

时间序列预测(十)——长短期记忆网络(LSTM)

目录 一、LSTM结构 二、LSTM 核心思想 三、LSTM分步演练 &#xff08;一&#xff09;初始化 1、权重和偏置初始化 2、初始细胞状态和隐藏状态初始化 &#xff08;二&#xff09;前向传播 1、遗忘门计算&#xff08;决定从上一时刻隐状态中丢弃多少信息&#xff09; 2、…

CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度

文章目录 box-sizing: border-box; 的含义默认盒模型 (content-box)border-box 盒模型 在微信小程序中的应用示例 在微信小程序中&#xff0c;CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度。具体来说&#xff0c; box-sizing: border-box; 会改…

使用TimeShift备份和恢复Ubuntu Linux

您是否曾经想过如何备份和恢复您的Ubuntu或Debian系统&#xff1f;TimeShift是一个强大的备份和还原工具。TimeShift允许您创建系统快照&#xff0c;提供了一种在出现意外问题或系统故障时恢复到先前状态的简便方式。您可以使用RSYNC或BTRFS创建快照。 有了这个介绍&#xff0…

SSM 图书馆借还系统-计算机设计毕业源码24465

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文章节安排 2相关技术介绍 2.1 B/S结构 2.2 SSM框架 2.3 MySQL数据库 3系统分析 3.1 可行性分析 3.2 系统功能性分析 3.3.非功能性分析 3.4 系统用例分析 3.5系统流程分析 3.5.1 用户登录流程 3.5.2 数据删…

中小企业设备资源优化:Spring Boot系统实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Prism 四事件聚合器

#1024程序员节&#xff5c;征文# 不废话&#xff0c;直接上代码一个简单的示例。 1、事件聚合 创建一个文件夹EventBLL&#xff0c;添加EventDemo.cs&#xff0c;代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using …

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法&#xff1a; 公钥&#xff1a;公共密钥&#xff0c;开放 私钥&#xff1a;私有密钥&#xff0c;保密 1.发送方用自己的公钥加密&#xff0c;接受方用发送方的私钥解密&#xff1a;不可行 2.发送方用接受方的公钥加密&#xff0c;接受方用自己的私钥解密…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

CryoEM - 冷冻电镜 基于深度学习的 从头重构(Ab-initio Reconstruction) 开源项目 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143162494 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 来源于 CryoDragon 算法 冷冻电镜(CryoEM) 是一种成像方式,为蛋白质和…

AOT漫谈专题(第六篇): C# AOT 的泛型,序列化,反射问题

一&#xff1a;背景 1. 讲故事 在 .NET AOT 编程中&#xff0c;难免会在 泛型&#xff0c;序列化&#xff0c;以及反射的问题上纠结和反复纠错尝试&#xff0c;这篇我们就来好好聊一聊相关的处理方案。 二&#xff1a;常见问题解决 1. 泛型问题 研究过泛型的朋友应该都知道…

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景&#xff0c;限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战&#xff0c;本文…

qt QHBoxLayout详解

QHBoxLayout 是 Qt 框架中用于创建水平布局的类。它将子控件以横向的方式排列&#xff0c;并自动调整大小&#xff0c;以适应父窗口的尺寸变化。 重要方法 QHBoxLayout(QWidget *parent nullptr)&#xff1a;创建一个 QHBoxLayout 对象&#xff0c;并指定其父窗口部件。addWi…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…

深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)

目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但是作为基准数据集过于简单&#xff0c;在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…

前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML

HTML 基础入门&#xff1a;从零开始构建网页骨架 目录 1. 什么是 HTML&#xff1f;HTML 的核心作用 2. HTML 基本结构2.1 DOCTYPE 声明2.2 <html> 标签2.3 <head> 标签2.4 <body> 标签 3. HTML 常用标签详解3.1 标题标签3.2 段落和文本标签3.3 链接标签3.4 图…