转自: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 编译概述的更多相关文章

  1. [转]UE4 Blueprint编译过程

    Blueprint 编译概述   一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在BP编辑器中,点击编译按钮时候,BP资源开始把属性和图例过程转换为一个类对象处理. 1 ...

  2. Blueprint编译过程

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

  3. compilation与编译

    关于本配置节的内容不算多,但关于ASP.NET编译的内容还是有一点的,鄙人认为只是了解一下即可,主要影响到部署. 在 App_Code 文件夹中使用多种编程语言 因为 App_Code 文件夹中的源代 ...

  4. (源)V8 Engine 编译

    v8 engine编译 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  5. ASP.NET 预编译

    ASP.NET 预编译概述 https://msdn.microsoft.com/zh-cn/library/bb398860%28v=VS.90%29.aspx 如何:预编译 ASP.NET 网站以 ...

  6. IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)

    IIS 7.0 的 ASP.NET 应用程序生命周期概述更新:2007 年 11 月本主题介绍在 IIS 7.0 集成模式下运行以及与 IIS 7.0 或更高版本一起运行的 ASP.NET 应用程序的 ...

  7. Openfire4源码部署到eclipse中并编译

    Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...

  8. nnet3配置中的“编译”

    编译概述 编译流程将Nnet和ComputationRequest作为输入,输出NnetComputation.ComputationRequest包含可用的输入索引 以及 请求的输出索引. 不提供输 ...

  9. ASP.NET 概述

    https://msdn.microsoft.com/zh-cn/library/4w3ex9c2(VS.100).aspx ASP.NET 概述 更新:2007 年 11 月 ASP.NET 是一个 ...

随机推荐

  1. 《WAP》第一次作业:团队亮相

    一.队名:WAP! 二.团队成员组长 组员 : 201571030302/杜有海 201571030327/乌勒扎 201571030304/郝明宇 201571030318/马麒 组长: 20157 ...

  2. vue项目打包部署到nginx 服务器上

    假如要实现的效果如下 http://ip/vue    =>是进入首页访问的路径是  usr/local/nginx/html/vue http://ip/website     =>是进 ...

  3. Oracle linux安装Oracle 11G

    Oracle  linux安装Oracle 11G 系统环境 Oracle linux   5.8.19.6(64位) Oracle     11.2.0.1(64位) 本文档详细介绍Oracle  ...

  4. Leetcode 34

    //二分查找后,向两边扩展,二分错了两次,现在是对的.//还有就是vector可以用{}直接赋值很棒 class Solution { public: vector<int> search ...

  5. spring boot 使用velocity模板(十六)

    (不要使用这种模板了,spring boot最新版已经不支持了.使用FreeMarker吧:http://blog.csdn.net/clementad/article/details/5194262 ...

  6. Hadoop的概念、版本、发展史

    Hadoop是什么?Hadoop的起源Hadoop发展史Hadoop的四大特性(优点)Hadoop的版本如何选择Hadoop版本 Hadoop是什么? Hadoop: 适合大数据的分布式存储和计算平台 ...

  7. Git 之 git原理简介

    这里只是很简单.超简单的介绍下git,为的是方便记忆: 本地仓库分为三个部分:工作区.暂存区.仓库区,其中暂存区和仓库区属于版本区. 对于文件的操作,需要从工作区----> 暂存区 ----&g ...

  8. 本地代码同步到github

    1 设置 ssh 公钥信息 首先你要确保 github 账号设置了ssh 公钥信息.如果没有的话可以按照下面的方式设置: 前往 github 网站的 account settings, 依次点击 Se ...

  9. webpack实现修改代码实时刷新浏览器

    webpack例子:https://github.com/Aquarius1993/webpackDemo 1. 需要全局和项目安装webpack和webpack-dev-server npm ins ...

  10. SpringBoot启动报:Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present!

    使用spring boot对项目改造,启动报错: Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel m ...