Blueprint编译过程
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
初学翻译,诚惶诚恐!
有不足之处,请多多指导!
万分感谢!
Blueprint编译过程的更多相关文章
- [转]UE4 Blueprint编译过程
Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在BP编辑器中,点击编译按钮时候,BP资源开始把属性和图例过程转换为一个类对象处理. 1 ...
- Blueprint 编译概述
转自:http://blog.csdn.net/cartzhang/article/details/39637269 一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在B ...
- Android 8.0编译过程
Android编译系统中的Android.bp.Blueprint与Soonghttp://note.qidong.name/2017/08/android-blueprint/ 工具链关系 Andr ...
- Android工程的编译过程
现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...
- GCC编译过程
以下是C程序一般的编译过程: gcc的编译流程分为四个步骤,分别为:· 预处理(Pre-Processing) 对C语言进行预处理,生成*.i文件.· 编译(Compiling) 将上一步生成的*.i ...
- Linux系统GCC常用命令和GCC编译过程描述
前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran. ...
- Hadoop源码编译过程
一. 为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...
- gcc编译过程简述
在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...
- android 编译过程
引用:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.html http://blog.sina.com.cn/s/blog_ ...
随机推荐
- 炮兵阵地(POJ 1185状压dp)
题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...
- C++实现离散余弦变换(参数为二维指针)
C++实现离散余弦变换(参数为二维指针) 写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有更上,这个月准备挑选一些较为经典的论文,将其中的算法实现.在实现论文 ...
- C++调用matlab实例
这段代码是C++调用matab引擎的过程,代码的目的很简单,在C++中创建一个vector数组,然后将这个vector数组单位化.写这个代码的目的是学些C++与matlab之间的数据交互,以供日后参考 ...
- CentOS7 mariadb 修改编码
CentOS7 mariadb 编码的修改: 网上看了不少的解决方案,要么是比较老的,要么是不正确,测试成功的方式,记录备查. 登录MySQL,使用SHOW VARIABLES LIKE 'chara ...
- pci hole -- 被吞噬的内存
参见wiki: http://en.wikipedia.org/wiki/PCI_hole PCI 空洞 pci 空洞是32位硬件和32位操作系统一个导致计算机显示的内存比实际安装的内存少的一个限制. ...
- python和tk实现桌面番茄时间(1)
参考资料: An Introduction To Tkinter Python 定时器 Python实例讲解 -- 定时播放 (闹钟+音乐) Python Tkinter之Label #coding= ...
- 并行开发——Parallel的使用 -摘自网络
随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”. 1. 硬件线程 ...
- jackson 注解的使用
在实体对象上添加 @JsonAutoDetect , 表明对该实体对象序列化成json串. @JsonAutoDetect public class User{ private int id; pri ...
- 深入浅出Zookeeper
能找到的一些zookeeper的资料一上来不是扯一通paxos算法就是一大坨一大坨的代码.很多人对zookeeper更多的是听过,所以这一篇文章就尝试用尽可能用精简的语言科普zookeeper. zo ...
- Java封装 properties文件操作
/** * Prop. Prop can load properties file from CLASSPATH or File object. */ public class Prop { priv ...