本文主要是介绍【UE4源代码观察】可视化所有模块的依赖情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路
UE4引擎的模块非常多,我想要观察他们的依赖情况。于是我写了程序读取所有模块的.Build.cs
文件,记录每个模块依赖的模块(当前是看PublicDependencyModuleNames和PrivateDependencyModuleNames。但后来经评论提醒我发现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源代码观察】可视化所有模块的依赖情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!