
UE源代码观察与实验
观察UE4源代码
还有一个测试工程对源代码进行实验
YakSue
这个作者很懒,什么都没留下…
展开
-
【UE4源代码观察】学习队列模板TQueue
队列“队列”是一个基础的数据结构,UE4对其有模板实现:TQueue,它在\Engine\Source\Runtime\Core\Public\Containers\Queue.h中定义。本篇记录了对它源码的观察。大体上,可以看到一个队列结构的教科书式的实现。但是代码实现上还牵扯到一些我还不熟悉的知识,因此我也将其记录下来。TQueue/** * Template for queues. * * This template implements an unbounded non-intrusi原创 2020-07-24 00:06:57 · 4694 阅读 · 5 评论 -
【UE4源代码观察】观察DerivedDataBackendInterface各个子类的关系
前言在《【UE4源代码观察】观察DDC(DerivedDataCache)》中FDerivedDataBackendInterface的接口/** * Interface for cache server backends. * The entire API should be callable from any thread (except the singleton can be assumed to be called at least once before concurrent ac原创 2020-06-09 23:57:13 · 915 阅读 · 0 评论 -
【UE4源代码观察】观察Lightmass一次Build的流程
本篇目标当使用者在UE4的编辑器内点下了Build按钮,一系列Build命令被触发,而“光照”则是其中重要的一环。我希望粗略的了解一下这其中背后的流程,随后我发现这个过程和 Swarm、Lightmass 这两个概念有关。具体来讲,这个过程包括的部分有:UnrealEd...原创 2020-06-01 23:57:24 · 3094 阅读 · 3 评论 -
【UE4源代码观察】观察TargetPlatform模块
前情提要与本次目标在之前的博客《【UE4源代码观察】观察 RHI、D3D11RHI、RenderCore 这三个模块的依赖关系》中,我将RHI、D3D11RHI、RenderCore这三个模块加入了我的空白工程中并确保可以成功编译。然而当时RenderCore模块有一个比较大的缺失:没有让shader相关的功能正常运行,因为它需要TargetPlatform模块中的内容。因此,这次我想观察一下这个模块,并希望能完成下面目标:了解这个模块的大体结构是什么,大概要做些什么事情将这个模块加入到我的空白工原创 2020-05-16 10:24:10 · 2319 阅读 · 0 评论 -
【UE4源代码观察】尝试调试UBT
前言在之前的博客《【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程》中我尝试动手搭建了一个用UBT进行编译的空白的工程。但是对UBT其中的逻辑并不理解。后来在学习UE4源代码的过程中,又了解了它的一些行为。目前,对我影响较大的是:1.他会有一些逻辑去添加一些宏。2.他会有一些逻辑去给修改ModuleRules(和.build.cs中内容的角色一样)。这时候我发现一些和预期不太一样的行为,因此就有了调试的需求。所幸,步骤很简单:步骤1.获得命令行参数UBT的参数最基本上是一个Targe原创 2020-05-15 22:43:15 · 2457 阅读 · 1 评论 -
【UE4源代码观察】观察GUID
GUID算法,怎么保证全局唯一的?/** * Implements a globally unique identifier. */struct FGuid{public: /** Holds the first component. */ uint32 A; /** Holds the second component. */ uint32 B; /** Holds the...原创 2020-04-24 22:46:30 · 6103 阅读 · 2 评论 -
【UE4源代码观察】观察DDC(DerivedDataCache)
清点这个模块里的classFDDCCleanupFDDCCleanup 是一个 FRunnable:/** * DDC Filesystem Cache cleanup thread. */class DERIVEDDATACACHE_API FDDCCleanup : public FRunnableFDerivedDataBackendInterface这个类没有父类:/...原创 2020-04-18 23:09:22 · 8477 阅读 · 4 评论 -
【UE4源代码观察】研究UE4里定义宏的方式
问题经过前面几篇博客,我已经了解到了宏在UE4中的重要作用,印象最深的是:它让很多地方的代码写得更简洁优雅(虽然这造成了可读性的下降)。除此之外,它还起到了控制代码路线的作用,例如在上一篇博客《【UE4源代码观察】观察 UE_LOG》中的:#if WITH_APPLICATION_CORE GError = FPlatformApplicationMisc::GetErrorOutputDe...原创 2020-04-11 21:40:51 · 5204 阅读 · 0 评论 -
【UE4源代码观察】观察 UE_LOG
查看Log对于UE4的Log,可以在“输出日志”中看到:在VS中的“输出”窗口中也可以看到:不过二者的内容有差异。目前我认为在“输出日志”中看到的都是经过UE_LOG宏输出的,这部分也一定会在VS中的“输出”窗口中看到。使用 UE_LOG对于如何使用UE_LOG,网上有很多教程。对于我而言,我喜欢在.cpp文件中开头加一个:DEFINE_LOG_CATEGORY_STATIC(L...原创 2020-04-10 22:29:18 · 2729 阅读 · 0 评论 -
【UE4源代码观察】观察 RHI、D3D11RHI、RenderCore 这三个模块的依赖关系
基本概念RHI(Render Hardware Interface)的职责是对OpenGL、DirectX3D、Vulkan这些图形接口API进行封装,来统一上层的调用。D3D11RHI就是 RHI 的 D3D11 的实现,模块中的很多类继承了 RHI 模块中的很多类,所以很显然D3D11RHI一定是依赖于RHI的。而RenderCore听名字就能知道,它包含了UE4渲染系统的很多核心内容,其中...原创 2020-04-05 18:32:50 · 5798 阅读 · 0 评论 -
【UE4源代码观察】观察RHICommand
FNoncopyableFRHICommandListBaseFRHICommandListFRHIAsyncComputeCommandListFRHICommandListImmediateFRHIAsyncComputeCommandListImmediateFRHICommandList_RecursiveHazardousFRHICommandBase是个链表:struct FRHI...原创 2020-04-03 23:52:48 · 3488 阅读 · 2 评论 -
【UE4源代码观察】观察 ENQUEUE_RENDER_COMMAND宏 是怎么工作的
问题在之前的博客《【UE4源代码观察】观察官方的GlobalShader范例》中,主线程中使用了ENQUEUE_RENDER_COMMAND宏来向渲染线程入列一个命令:ENQUEUE_RENDER_COMMAND(CaptureCommand)( [CompiledCameraModel, TextureRenderTargetResource, TextureRenderTargetNa...原创 2020-03-30 23:14:49 · 4889 阅读 · 0 评论 -
【UE4源代码观察】观察TaskGraph是如何执行任务的
TaskGraph是Core模块中定义的概念。可阅读TaskGraphInterfaces.h和TaskGraph.cpp文件来知晓完全的内容。值得一提的是,TaskGraph并不是多线程唯一的解决方案,在之前的博客《【UE4源代码观察】观察UE4的线程使用》有简单讨论UE4的各种多线程解决方案。下面观察TaskGraph一些基础的内容:FTaskGraphImplementationFTas...原创 2020-03-30 22:08:56 · 4122 阅读 · 0 评论 -
【UE4源代码观察】观察官方的GlobalShader范例
简介新建全局着色器为插件 | 虚幻引擎文档展示了如何创建一个GlobalShader。然而文档的内容基本上是指导你如何将现有的 “Lens Distortion”插件(位于 Engine\Plugins\Compositing\LensDistortion )中的代码拷贝到一个新的插件中并改名,并没有详细介绍更深的知识。因此,想要深入了解这方面的知识,还需要自己研究代码。我决定先尝试使用这个插...原创 2020-03-29 10:47:15 · 3965 阅读 · 12 评论 -
【UE4源代码观察】观察D3D11是如何被RHI封装的
我想了解D3D11是如何被UE4的RHI封装的。我知道这牵扯到很多复杂的内容,但通过观察一些最基础的API被谁在哪调用,可以对RHI是如何封装的有一个大致了解。在之前的博客《创建一个最小的D3D11实例》中,有一些最基础的D3D11的API调用,我选他们作为观察的对象。ID3D11Device 是怎么被创建的?首先,FD3D11Device 被定义为了 ID3D11Device,这在 D3D1...原创 2020-03-24 23:23:19 · 2558 阅读 · 0 评论 -
【UE4源代码观察】观察UE4的线程使用
0.起点我想观察UE4编辑器运行时后台都存在哪些线程,以及他们都是怎么被创建的。为此,我在出现项目浏览界面时,在Tick中打了一个断点,准备观察VS中显示的线程。需要注意的是:1.这个观察不是稳定的,下次打开很可能会有差别(但应有基础不变的东西)2.此时还在项目浏览器界面,当真正进入编辑器后,线程应该会更多。1.清点出现的线程发现此刻有110个线程:根据位置这一分栏的信息可以将...原创 2020-03-17 17:26:57 · 4705 阅读 · 0 评论 -
【UE4源代码观察】尝试生成启动画面
test原创 2020-03-02 16:26:49 · 2629 阅读 · 0 评论 -
【UE4源代码观察】观察Core模块
话题Core模块是整个引擎中最核心的模块,在之前的博客【UE4源代码观察】可视化所有模块的依赖情况中有统计,它被983个模块引用,恐怕除了第三方的模块外基本所有模块都有引用。我想首先观察其中的内容,然后再做测试:将Core模块拷贝到之前【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程建立的空白工程中,看能否将它成功编译,理论上讲,“核心”不应再依赖太多其他的东西,所以我应该不会再需要...原创 2020-03-01 18:08:29 · 4441 阅读 · 0 评论 -
【UE4源代码观察】在空白工程中测试跨模块调用函数
目的在之前的博客【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程中,成功让UBT工作起来了。现在我想要测试编译出的多个模块之间是否能互相调用,我记录下测试的过程。最终工程见 工程GIT链接。实践第一部分首先仿照TestA模块建立TestB模块。在TestB.h文件中声明了一个函数int TestBFunc(int x, int y);并在TestB.cpp中写他的实现...原创 2020-02-27 23:05:45 · 1679 阅读 · 0 评论 -
【UE4源代码观察】观察FEngineLoop中各函数的调用顺序
当启动编辑器时,Launch模块是启动模块,在Windows平台中 LaunchWindows.cpp 的 WinMain函数是入口,而 FEngineLoop 管理了程序的初始化与主循环。他的成员函数如下:public: /** * Pre-Initialize the main loop, and generates the commandline from standard Arg...原创 2020-02-26 23:49:27 · 1360 阅读 · 0 评论 -
【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程
我想观察UE4是怎么编译的,于是查阅官方文档,了解到UE4有一套自己的编译工具:UnrealBuildTool,简称UBT。关于UBT的官方文档参阅:虚幻编译工具。我想尝试自己手动建立一个使用UBT进行编译的空白工程。不过首先,先了解下UBT的编译流程中一些文件所扮演的角色UBT的编译流程中一些文件所扮演的角色模块每个模块都由一个 .build.cs 文件声明,它存储在 Source 目录下...原创 2020-02-23 16:22:21 · 6248 阅读 · 2 评论 -
【UE4源代码观察】可视化所有模块的依赖情况
思路UE4引擎的模块非常多,我想要观察他们的依赖情况。于是我写了程序读取所有模组的".Build.cs"文件,记录每个模块依赖的模块,然后根据一个自定的规则来排列他们,最后显示出来。这个规则如下:我引入一个依赖层级的概念:假设一个模块不依赖于任何其他模块,那他的依赖层级为0;假设A模块依赖于一个模块B,则A的依赖层级比B的依赖层级大1;假设A模块依赖于多个模块,则A的依赖层级比他所依赖的所有...原创 2020-02-20 23:57:04 · 3188 阅读 · 6 评论