Blueprint 编译概述
转自:http://blog.csdn.net/cartzhang/article/details/39637269
一、术语
Blueprint,像C++语言一下的,在游戏中使用前需要编译。当你在BP编辑器中,点击编译按钮时候,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编译过程
Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前须要编译.当你在BP编辑器中,点击编译button时候.BP资源開始把属性和图例过程转换为一个类对象处理. ...
- compilation与编译
关于本配置节的内容不算多,但关于ASP.NET编译的内容还是有一点的,鄙人认为只是了解一下即可,主要影响到部署. 在 App_Code 文件夹中使用多种编程语言 因为 App_Code 文件夹中的源代 ...
- (源)V8 Engine 编译
v8 engine编译 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...
- ASP.NET 预编译
ASP.NET 预编译概述 https://msdn.microsoft.com/zh-cn/library/bb398860%28v=VS.90%29.aspx 如何:预编译 ASP.NET 网站以 ...
- IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)
IIS 7.0 的 ASP.NET 应用程序生命周期概述更新:2007 年 11 月本主题介绍在 IIS 7.0 集成模式下运行以及与 IIS 7.0 或更高版本一起运行的 ASP.NET 应用程序的 ...
- Openfire4源码部署到eclipse中并编译
Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...
- nnet3配置中的“编译”
编译概述 编译流程将Nnet和ComputationRequest作为输入,输出NnetComputation.ComputationRequest包含可用的输入索引 以及 请求的输出索引. 不提供输 ...
- ASP.NET 概述
https://msdn.microsoft.com/zh-cn/library/4w3ex9c2(VS.100).aspx ASP.NET 概述 更新:2007 年 11 月 ASP.NET 是一个 ...
随机推荐
- 前端工程化 - gulp
gulp是什么 gulp就是一个前端的自动化构建工具,在开发过程中很多重复的任务可以使用gulp和gulp插件自动完成.相比于grunt,gulp非常好上手,核心API只有4个,而且还有丰富的插件库. ...
- 伪多项式时间 Pseudo-polynomial time
2018-03-15 14:20:08 伪多项式时间:如果一个算法的传统时间复杂度是多项式时间的,而标准时间复杂度不是多项式时间的,则我们称这个算法是伪多项式时间的. 想要理解“伪多项式时间”,我们需 ...
- Spring MVC配置静态资源和资源包
Spring MVC配置静态资源和资源包 本例映射:css目录: pom.xml <properties> <spring.version>4.3.5.RELEASE</ ...
- Xmind8 (update8)破解教程
环境:Win7 一.下载xmind: Xmind版本:xmind-8-update8-windows.exe 百度云盘地址: https://pan.baidu.com/s/1ccd18E1hOY1 ...
- 在不同的浏览器使用不同的css样式,解决浏览器兼容问题
区别IE6与FF: background:orange; *background:blue; 区别IE6与IE7: background:green !import ...
- https ddos检测——研究现状
from: https://jyx.jyu.fi/bitstream/handle/123456789/52275/1/URN%3ANBN%3Afi%3Ajyu-201612125051.pdf 相关 ...
- 前端 crypto-js aes 加解密
下载:npm install crypto-js --save 需要定义两个方法 ,分别是用于加密和解密,这里我将它放在了 utils 文件夹下,命名为 secret.js ,其具体代码如下: con ...
- c#常日期转换(转)
DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2.Text = dt.ToFile ...
- Haproxy的负载均衡和高可用配置
一.Haproxy的理解 Haproxy是一个使用c语言编写的自由开发源代码软件,它提供高可用性.负载均衡.以及基于http和tcp的应用程序代理. Haproxy特别使用于那些负载特别大 ...
- AI产业将更凸显个人英雄主义 周志华老师的观点是如此的有深度
今天无意间在网上看的了一则推送,<周志华:AI产业将更凸显个人英雄主义> http://tech.163.com/18/0601/13/DJ7J39US00098IEO.html 摘录一些 ...