【UE4源代码观察】可视化所有模块的依赖情况

2024-09-06 23:58

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

思路

UE4引擎的模块非常多,我想要观察他们的依赖情况。于是我写了程序读取所有模块的.Build.cs文件,记录每个模块依赖的模块(当前是看PublicDependencyModuleNamesPrivateDependencyModuleNames。但后来经评论提醒我发现AddEngineThirdPartyPrivateStaticDependencies也应该视作是“依赖”但没统计,后续待修正_2020.12.3),然后根据一个自定的规则来排列他们,最后显示出来。
这个规则如下:
我引入一个依赖层级的概念:假设一个模块不依赖于任何其他模块,那他的依赖层级为0;假设A模块依赖于一个模块B,则A的依赖层级比B的依赖层级大1;假设A模块依赖于多个模块,则A的依赖层级比他所依赖的所有模块中依赖层级最大的大1。除了依赖层级外,我还统计了每个模块被依赖的次数,在同一层级内将被依赖次数高的模块放在了前面

成果

统计时,所UE4引擎源代码下载时间是:‎2020‎年‎2‎月‎14‎日,版本为4.24.2
统计的模块涵盖了 Runtime, Editor, Developer, Programs, Plugins, ThirdParty。他们在图中的颜色表示如下:
在这里插入图片描述
因为模块太多,所以我分成了三个部分:假设一个模块不依赖于任何模块,也不被任何一个模块依赖,那就叫他“孤单模块”;假设一个模块有依赖的模块,但是不被任何模块依赖,则叫他“叶子模块”;除此之外,就是“枝干模块”。

枝干模块:

(模块之后的数字是被引用的次数)
在这里插入图片描述

叶子模块:

在这里插入图片描述

孤单模块:

在这里插入图片描述
(按理说不应该出现这类模块,他们可能表示有的依赖关系没有统计上,正如开头所说,经评论提醒:我发现AddEngineThirdPartyPrivateStaticDependencies这种依赖关系没统计,这导致了一些模块被视为了所谓的“孤单模块”,此处之后有机会要重新统计修正_2020.12.3)

其他细节

循环引用

理想模式下规则是没有漏洞的,但是UE4模组之间存在着循环依赖的问题:即A依赖了B,B又依赖了A。这时我不得不对规则进行补充:
如果A依赖的众多模块中存在一个B,而B又依赖了A,则A在统计依赖层级最大值时忽略B的依赖层级。
补充上这条规则之后,所有模块的依赖层级都可以正常计算了

未找到的模块

即有些指明依赖的模块却找不到对应的".Build.cs"文件,但并不多,具体是:

AESGCMHandlerComponent depend PlatformCryptoBCrypt not found
AESGCMHandlerComponent depend PlatformCryptoSwitch not found
AESHandlerComponent depend PlatformCryptoBCrypt not found
AESHandlerComponent depend PlatformCryptoSwitch not found
AudioCapture depend AudioCapturePS4Voice not found
AudioCapture depend AudioCaptureSwitch not found
AudioMixerXAudio2 depend XMA2 not found
CADInterfaces depend CoreTech not found
CADLibrary depend CoreTech not found
DatasmithC4DTranslator depend MelangeSDK not found
DatasmithCADTranslator depend CoreTech not found
DatasmithDispatcher depend CoreTech not found
DatasmithIFCTranslator depend IFCEngine not found
DatasmithOpenNurbsTranslator depend OpenNurbs6 not found
DatasmithOpenNurbsTranslator depend CoreTech not found
DatasmithWireTranslator depend OpenModel not found
DatasmithWireTranslator depend CoreTech not found
Engine depend SwitchRuntimeSettings not found
GameplayMediaEncoder depend IBMRTMPIngest not found
NonRealtimeAudioRenderer depend XMA2 not found
PlatformCrypto depend PlatformCryptoBCrypt not found
PlatformCrypto depend PlatformCryptoSwitch not found
WindowsMixedRealityRHI depend ShaderCore not found
XAudio2 depend XMA2 not found

现在已经查明有些是由于平台的关系,没有对应平台的模块。不知道有没有其他的情况。

模块名字大小写

有些模块的大小写与文件不一致,已经修过了,具体是

AxFImporter: Mainframe -> MainFrame
BuildPatchTool: Http -> HTTP
DataPrepEditor: DataprepCore -> DataPrepCore
DataPrepLibraries: DataprepCore -> DataPrepCore
DatasmithCoreTechExtension: DataprepCore -> DataPrepCore
DatasmithImporter: DataprepCore -> DataPrepCore
ExternalRpcRegistry: HTTPServer -> HttpServer
GLTFImporter: Mainframe -> MainFrame
HTTPChunkInstaller: Http -> HTTP
LauncherServices: JSON -> Json
MDLImporter: Mainframe -> MainFrame
MobileLauncherProfileWizard: JSON -> Json
OnlineSubsystemGameCircle: Http -> HTTP
OnlineSubsystemGooglePlay: Http -> HTTP
OnlineSubsystemIOS: Http -> HTTP
PerfCounters: HTTPServer -> HttpServer
StaticMeshEditorExtension: DataprepCore -> DataPrepCore
UnrealEd: Http -> HTTP
WebMMedia: LibVpx -> libvpx
WebMMedia: LibWebM -> libwebm
WebRemoteControl: HTTPServer -> HttpServer

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


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

相关文章

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数