虚幻4蓝图编译剖析(三)

2016-10-31 08:26 by 风恋残雪, 221 阅读, 1 评论, 收藏编辑

编译

上面基本的术语已经介绍完了,下面我们进入来进入蓝图编译过程分析。蓝图的编译过程都在FKismetCompilerContext::Compile()函数中。它根据编译的类型不同(上文编译选项中提到的只编译Skeleton、只生成字节码、只生成cpp代码等等)会走不同的分支。我们这里以完全编译来讲解。此处为大概的流程,若想看详细的流程,请参照流程图以及代码。

 

清除类

类是就地编译的,这意味着同一个UBlueprintGeneratedClass在每次编译的时候都会被清理,并且会重复利用,这样指向这个类的指针就不用修复了。CleanAndSanitizeClass()把属性和函数放到临时包的一个垃圾(trash)类里面,然后清除类中的所有数据。

创建类的属性

CreateClassVariablesFromBlueprint()函数遍历蓝图的NewVariables数组,也包括构造脚本、Timeline等地方来找到该类需要的所有属性,然后创建UProperties。

创建函数列表

通过处理事件图表(Event graph)、常规的函数图表、代理、以及接口中来创建函数。

处理事件图表

CreateAndProcessUberGraph()函数用来处理事件图表。它把所有的事件图表拷贝到一个大的图中,这个时候节点有机会去做展开操作(expand,如果它需要的话)。然后会为图中的每一个事件节点创建一个函数桩(stub),最终会为当前的事件图表创建一个FKismetFunctionContext,用于把整个事件图表当作一个函数来处理。

处理函数图表

常规函数图表的处理是通过ProcessOneFunctionGraph()函数来完成的,它会把图中的每一个节点拷贝到另外一个节点中去,这个时候每个节点有机会展开(expand),最后会为每一个函数创建一个FKismetFunctionContext,用来后面对该函数的编译工作。

预编译函数

函数的预编译是通过为每一个FKismetFunctionContext调用PrecompileFunction()来实现的,这个函数主要做以下操作:

  1. 确定执行顺序并计算数据依赖。
  2. 去除那些没有连接的或者无数据依赖的节点。
  3. 为每一个剩下的运行每一个节点处理器(FNodeHandlingFunctor)的RegisterNets()函数,它会为函数中的值创建FBPTerminal。
  4. 创建UFunction对象和相关的属性。

绑定和链接类

现在类已

网友评论