Blueprint 编译概述


一、术语

Blueprint,像C++语言一下的,在游戏中使用前须要编译。当你在BP编辑器中,点击编译button时候。BP资源開始把属性和图例过程转换为一个类对象处理。

1. FKismetCompilerContext

此类用来做编译工作。每次编译就会产生一个新的实例。保存将编译的类和BP等。

2. FKismetFunctionContext

为一个函数保存信息。比如关系图引用,属性和产生UFunction.

3. FNodeHandlingFunctor

一个帮助类,用来处理在编译器(单例)中一个类的节点。包括函数产生的注冊管脚链接。产生编译状态。

4. FKismetCompiledStatement

编译器转换节点为编译状态。后端把它转换为字节码操作。

5. FKismetTerm

图例的终端,包含有literal,const,variable reference(变量引用)。每一个数据管脚连接当中一项。

当然你能够通过NodeHandlingFunctor来自己定义变量或中间结果。

二、编译过程

基本处理步骤例如以下:

橙色的为全编译下才有的步骤。

关于缩写:

class default object (CDO)

清理类

类使用UBlueprintGeneratedClass 产生的对象,被清零并重复使用。指针不用处理UE4自己搞定。

CleanAndSanitizeClass函数功能是擦除函数属性和功能,初始化类对象。

(由于UE4使用的类对象池,类对象不删除,每次都用新的取代旧的对象)。

创建类属性

编译迭代通过蓝图的NewVairable数组和其它地方(构建脚本等)查找到类须要的全部Uproperites。然后使用CreateClassVariablesFromBlueprint函数,在UClass范围内创建UProperties 。(先找到Properites标示,然后使用函数来创建属性)。

创建函数列表

编译器使用Event Graphs创建函数列表。每一个内容调用PrecompileFunction()函数来穿件正常函数图和预编译函数。

处理事件图表

通过使用CreateAndProcessUberGraph() 来实现处理过程。

此函数拷贝全部的事件图表到一个大图表中,在确定哪些节点能够扩展后,为每一个函数创建事件节点。每一个事件图表创建FKismetFunctionContext。

处理函数图表

通过使用ProcessOneFunctionGraphProcessing 函数来处理常规函数图表 ,该函数把每一个图表复制到暂时图表中,以便于有机会扩展。

每一个函数图表创建FKismetFunctionContext。

预编译函数

PrecompileFunction()是预编译函数。过程例如以下:

· 运行列表和计算数据依赖关系

· 更改无时间表或无数据依赖的节点。

· 执行节点的RegisterNets() 函数

· 为函数捏的值创建FKismetTerms

· 创建UFunction和关联属性

绑定和链接

编译器感知到类的全部UProperties 和UProperties 。绑定和链接类。包含属性关系,属性大小,函数映射等。

此时。实际上是一个没有最后标示和元数据的缺省类对象。

编译函数

下一步就是通过节点句柄Compile()函数,使用AppendStatementForNode()函数。为剩余的节点产生FKismetCompiledStatment 的对象。(就是产生状态对象)。

AppendStatementForNode函数也能够创建用于本地使用的FKmismet对象。

完毕编译类

To finish compiling the class, compiler finalizes the class flags and propagates flags and metadata from the parent class before finally performing a few final checks to make sure everything went alright in the compile.

在最后编译之前,须要确保全部的检查都正确,编译器确认类标示,传播标示。来自父类的元数据。

产生代码

backends 从每一个函数内容的状态转换为代码。

两个backends使用:

·  FKismetCompilerVMBackend - 转换FKCS 为虚幻虚拟机脚本字节流。字节流将被序列化为函数的脚本数组。

·  FKismetCppBackend - 产生用来调试的类C++代码。

拷贝类缺省对象属性

使用CopyPropertiesForUnrelatedObjects()函数,编译器拷贝旧缺省对象的值到新的CDO。属性拷贝通过标签的序列化。仅仅要名字一致就能够正确转换。在本阶段CDO组件重建实例和适当改动。 The GeneratedClass CDO is authoritative.

重建实例

由于类的大小或属性会增减,编译器每次编译须要重建实例。过程中使用TObjectIterator 来找到全部类的实例,在产生一个新类。使用CopyPropertiesForUnrelatedObjects函数来把旧实例复制到新实例中。

关于细节,请看 FBlueprintCompileReinstancer类。

===============

原文地址:https://docs.unrealengine.com/latest/INT/Engine/Blueprints/TechnicalGuide/Compiler/index.html

初学翻译,诚惶诚恐!

有不足之处,请多多指导!

万分感谢!

最新文章

  1. Cobar + MySQL 技术验证(li)
  2. js隐藏或显示某区域
  3. Effective C++ -----条款41:了解隐式接口和编译期多态
  4. win32 公用对话框
  5. R语言 如何为图片添加文字说明(转载)
  6. Discuz!图片查看插件(支持鼠标缩放、实际大小、旋转、下载)
  7. APIO2012派遣
  8. 在ASP中调用DLL的方法
  9. centos6 Cacti部署文档
  10. 继承CWnd自绘按钮
  11. Android设置Activity背景为透明style
  12. Paxos 实现日志复制同步
  13. Exchange 2016 体系结构
  14. 201521123016 《Java程序设计》第13周学习总结
  15. 排序算法Java实现(冒泡排序)
  16. sublim 插件
  17. 配置MQTT服务器
  18. Android 底部菜单会被顶起来的情况
  19. openfire群消息投递
  20. c++中new的三种用法详细解析

热门文章

  1. Fixing the Great Wall
  2. bzoj 1391 [Ceoi2008]order(最小割)
  3. Codeforces Round #362
  4. 在Raspberry Pi上安装XBMC
  5. Install_pygments
  6. list、tuple、dict、set、map
  7. unix文件权限
  8. 解决oracle启动的错误: ORA-00119 ORA-00132
  9. SOP、DIP、PLCC、TQFP、PQFP、TSOP、BGA封装解释
  10. CodeForces 705A Hulk (水题)