【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

相关文章

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

python中poetry安装依赖

《python中poetry安装依赖》本文主要介绍了Poetry工具及其在Python项目中的安装和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前言1. 为什么pip install poetry 会造成依赖冲突1.1 全局环境依赖混淆:1

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Python模块导入的几种方法实现

《Python模块导入的几种方法实现》本文主要介绍了Python模块导入的几种方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、什么是模块?二、模块导入的基本方法1. 使用import整个模块2.使用from ... i