【UE4源代码观察】观察Core模块

2024-09-06 23:58
文章标签 模块 ue4 core 源代码 观察

本文主要是介绍【UE4源代码观察】观察Core模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

话题

Core模块是整个引擎中最核心的模块,在之前的博客【UE4源代码观察】可视化所有模块的依赖情况中有统计,它被983个模块引用,恐怕除了第三方的模块外基本所有模块都有引用。我想首先观察其中的内容,然后再做测试:将Core模块拷贝到之前【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程建立的空白工程中,看能否将它成功编译,理论上讲,“核心”不应再依赖太多其他的东西,所以我应该不会再需要补充太多它所依赖的东西。

观察

Core模块包含了九百个h文件和近四百个cpp文件,有相当多的内容。在VS的解决方案资源管理器中观察它的文件层级结构是这样的:
在这里插入图片描述
在“Public”层级下分为了35个文件夹和7个头文件,我想在这个层级下观察每个文件夹和头文件都代表了哪些内容。

I.平台相关的文件夹

Android Apple Clang HoloLens IOS Linux Lumin Mac Unix Windows 文件夹都是对应各个平台的内容,而GenericPlatform 是平台抽象类,它其中包含很多其他平台中的类的基类。UE4在跨平台上的语法是这样的:
以FMemory为例,打开UnrealMemory.h:

struct CORE_API FMemory
{/** @name Memory functions (wrapper for FPlatformMemory) */static FORCEINLINE void* Memmove( void* Dest, const void* Src, SIZE_T Count ){return FPlatformMemory::Memmove( Dest, Src, Count );}static FORCEINLINE int32 Memcmp( const void* Buf1, const void* Buf2, SIZE_T Count ){return FPlatformMemory::Memcmp( Buf1, Buf2, Count );}

会发现FMemory中使用了很多FPlatformMemory的成员函数。
FPlatformMemory是什么要看它include的"HAL/PlatformMemory.h":

#include COMPILED_PLATFORM_HEADER(PlatformMemory.h)

这个宏会根据不同的平台扩展为对应平台的文件,比如我现在是Windows,则扩展为了WindowsPlatformMemory.h:
在这里插入图片描述
在这个文件中会看到:

typedef FWindowsPlatformMemory FPlatformMemory;

FWindowsPlatformMemory这个类的基类是FGenericPlatformMemory

II.其他文件夹

algo: algorithm(算法)。包含众多算法,如二分法查找等
Async:异步。多线程相关的内容,很重要,TaskGraphInterfaces就在这里。
Container:容器类
Delegates:应该是一个重要的部分,看名字似乎是入口函数?对此理解不深,待后续理解。
FramePro:看名字似乎是Frame Profiler?
HAL:Hardware Abstraction Layer(硬件抽象层)
Hash:看名字似乎和哈希有关?
Internationalization:包含本地化相关内容,包括FText的定义。
Logging:打Log相关
Math:数学库
MemPro:看名字是Memory Profiler?
Misc:杂项
Modules:模块相关的基本功能
ProfilingDebugging:看名字似乎是性能分析调试相关。
Serialization:序列化相关。
Templates:模板类,包括智能指针。
UObject:虽然UObject的定义有专门的模块,但Core模块似乎需要一些提前定义的内容,比如UObjectHierarchyFwd.h中存放的前向声明,其他还包含一些XXXVersion.h,待后续研究。

IO看名字本以为是个有分量的部分,但其中只有一个IoDispatcher文件,目前还不清楚是做什么用的。
Memory看名字本以为是个有分量的部分,但其中只有一个MemoryArena文件,目前还不清楚是做什么用的。
MSVC其中只包括了一个头文件,在这个头文件中只有一个宏。

还有一些目前并不太清楚和什么相关的:
Concepts Features Stats Traits。其中Stats或许应该研究下。

III.头文件

Core.h中include了大量的h文件,本身不包含其他定义,目前还不清楚在什么情况下需要include“Core.h”。
CoreMinimal.h被前者include,它很重要,通常都能在其他头文件中看到它第一个被include。这个文件会include一些最基本的头文件,它和UE4的IWYU规则有关。
CoreTypes.h它include了一些最底层的定义,被CoreMinimal所include,
CoreFwd.h包含了很多基本的类的前向声明,它也被CoreMinimal所include。
CoreSharedPCH.h中也include了大量的头文件,但也不清楚什么情况下需要include它。
CoreGlobals.h中有很多内容,应该非常重要,待后续研究。
PixelFormat.h还不清楚作用。

测试

完整工程见GIT上的完整工程,我把步骤与遇到的问题记录下来:

1.拷贝模块

虽然Core模块很核心,但是它本身还是依赖了两个模块:BuildSettings 和 TraceLog。这两个模块本身内容量不多,而且并没有再依赖于更多的模块了,因此这里就直接将他们一起拷贝过来了。

2.注释掉PrivateIncludePathModuleNames

1>UnrealBuildTool : error : Could not find definition for module 'TargetPlatform', (referenced via Target -> TestA.Build.cs -> Core.Build.cs)

我发现在PrivateIncludePathModuleNames中,Core模块还指定一些模块中的文件会被include

PrivateIncludePathModuleNames.AddRange(new string[] {"TargetPlatform","DerivedDataCache","InputDevice","Analytics","RHI"});

这些模块本身又会依赖更多的模块,因此若将它们拷贝过来会耗费很大的力气,于是我选择先将这部分注释掉。这一操作一定会导致后续有include找不到,但如果牵扯到的内容不多的话,那再继续注释掉相关的功能也可以接受。

3.拷贝第三方库

1>UnrealBuildTool : error : Could not find definition for module 'zlib', (referenced via Target -> TestA.Build.cs -> Core.Build.cs)

有些第三方库的模块找不到,于是我拷贝了这些模块过来,包括zlib IntelTBB IntelVTune ICU。这些库似乎.lib文件也需要一块拷贝(我并不确定能否用源码编译出来)。一下子让工程的体积变大了。

4.注释掉相关的功能

第2步的“恶果”来了:

1>  [5/18] Module.Core.9_of_12.cpp
1>D:/0_WorkSpace/UEYaksueTest/Engine/Source/Runtime/Core/Private/Serialization/Archive.cpp(25): fatal error C1083: 无法打开包括文件: “Interfaces/ITargetPlatform.h”: No such file or directory
1>  [6/18] Module.Core.7_of_12.cpp
1>D:/0_WorkSpace/UEYaksueTest/Engine/Source/Runtime/Core/Private/Misc/CoreMisc.cpp(18): fatal error C1083: 无法打开包括文件: “DerivedDataCacheInterface.h”: No such file or directory

但万幸所牵扯的内容很少,先注释掉h文件的include,然后再注释掉使用的地方就好了。

5.处理链接错误

1>Module.Core.2_of_12.cpp.obj : error LNK2001: 无法解析的外部符号 "wchar_t * GInternalProjectName" (?GInternalProjectName@@3PA_WA)
1>Module.Core.7_of_12.cpp.obj : error LNK2001: 无法解析的外部符号 "wchar_t * GInternalProjectName" (?GInternalProjectName@@3PA_WA)
1>Module.Core.8_of_12.cpp.obj : error LNK2001: 无法解析的外部符号 "wchar_t * GInternalProjectName" (?GInternalProjectName@@3PA_WA)
1>Module.Core.11_of_12.cpp.obj : error LNK2001: 无法解析的外部符号 "wchar_t * GInternalProjectName" (?GInternalProjectName@@3PA_WA)
1>Module.Core.2_of_12.cpp.obj : error LNK2001: 无法解析的外部符号 "wchar_t const * const GForeignEngineDir" (?GForeignEngineDir@@3PEB_WEB)
1>D:\0_WorkSpace\UEYaksueTest\Engine\Binaries\Win64\Test1.exe : fatal error LNK1120: 2 个无法解析的外部命令

这两个没找到的变量都是extern,在CoreGlobals.h中有定义:

extern CORE_API TCHAR GInternalProjectName[64];
extern CORE_API const TCHAR* GForeignEngineDir;

他们的定义都在UE4Game.cpp中:

TCHAR GInternalProjectName[64] = TEXT("");
IMPLEMENT_FOREIGN_ENGINE_DIR()

由于在源代码的Target,UE4Editor.Target.cs中有:

ExtraModuleNames.Add("UE4Game");

所以这两个变量定义能够找到。但是现在我的工程里没有UE4Game模块,所以并不能找到定义。
于是,我临时将 GInternalProjectName 的 extern符号去掉,将 GForeignEngineDir 使用的地方注掉,便可以保证了编译通过。

6.完成!测试

为了测试Core模块能否可以正常使用,我在TestA.cpp中尝试使用了TArray:

#include"../../Runtime/Core/Public/CoreMinimal.h"#include<iostream>int main()
{TArray<int> testList;testList.Add(3);testList.Add(4);std::cout << testList[0]- testList[1]<< std::endl;return 0;
}

最终可以成功编译,并且运行:
在这里插入图片描述

这篇关于【UE4源代码观察】观察Core模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143489

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

1、创建多模块的maven springboot项目

现在的java的项目都是多模块的,这次也跟个风。 目标:实现下述结构 项目AcedBoot, 子模块:         aced-api 对外提供接口,         aced-web 给前端提供接口,         aced-service 服务层,         aced-dao 数据底层,包含数据库mapper和实体类entity,         aced-commo

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

PrestaShop免费模块/插件/扩展/工具下载

PrestaShop免费模块/插件/扩展/工具下载 PrestaShop免费模块 适用于您的电子商务网站的PrestaShop模块 现有超过3,000个PrestaShop模块可帮助您自定义在线商店,增加流量,提高转化率并建立客户忠诚度。 使您的电子商务网站成功! 下载(超过142+之多的PrestaShop官网认证的免费模块) 标签PrestaShop免费, PrestaShop免费工