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编译过程的更多相关文章

  1. [转]UE4 Blueprint编译过程

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

  2. Blueprint 编译概述

    转自:http://blog.csdn.net/cartzhang/article/details/39637269 一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在B ...

  3. Android 8.0编译过程

    Android编译系统中的Android.bp.Blueprint与Soonghttp://note.qidong.name/2017/08/android-blueprint/ 工具链关系 Andr ...

  4. Android工程的编译过程

    现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...

  5. GCC编译过程

    以下是C程序一般的编译过程: gcc的编译流程分为四个步骤,分别为:· 预处理(Pre-Processing) 对C语言进行预处理,生成*.i文件.· 编译(Compiling) 将上一步生成的*.i ...

  6. Linux系统GCC常用命令和GCC编译过程描述

    前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran. ...

  7. Hadoop源码编译过程

    一.           为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...

  8. gcc编译过程简述

    在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...

  9. android 编译过程

    引用:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.html http://blog.sina.com.cn/s/blog_ ...

随机推荐

  1. Storm入门教程 第二章 构建Topology[转]

    2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies Streams Spouts Bolts Stream groupings Reliability ...

  2. 关于duilib中的list的扩展探索

    原文地址:http://blog.csdn.net/tragicguy/article/details/21893065 今天在做一个程序的界面时,需要在一个列表中显示除文字以外的其他控件,如:Edi ...

  3. 我是面试官--"自我介绍"

    工作10余年,经历过很多次面试,也面试了N多人.这些年来,已经有好些位朋友(或同事)与我聊起相关话题,涉及面试,更关乎职业生涯规划.感触颇多,就借助自媒体的浪潮,与更多的程序员一起共谈面试经历,希望可 ...

  4. 如何避免JavaScript的内存泄露及内存管理技巧

    发表于谷歌WebPerf(伦敦WebPerf集团),​​2014年8月26日. 高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果 ...

  5. Probabilistic SVM 与 Kernel Logistic Regression(KLR)

    本篇讲的是SVM与logistic regression的关系. (一) SVM算法概论 首先我们从头梳理一下SVM(一般情况下,SVM指的是soft-margin SVM)这个算法. 这个算法要实现 ...

  6. 线段相交 poj 1066

    // 线段相交 poj 1066 // 思路:直接枚举每个端点和终点连成线段,判断和剩下的线段相交个数 // #include <bits/stdc++.h> #include <i ...

  7. 未能加载Connector/NET :: v6.7.4

    //从*.config文件获取连接字符串和提供程序 string dp = ConfigurationManager.AppSettings["provider"]; string ...

  8. JQuery好用的日期选择控件 DatePicker

    近期发现一个很好的基于JQ的前端UI日期选择控件Jquery.DatePicker.js 下载地址:jquery.DatePIcker.js 演示地址:DatePicker - 基于jQuery 1. ...

  9. c++ Map使用

    引入头文件: #include <map>1.初始化map<int, int> a, b;map<sting, int> a, b;2.添加数据 map<in ...

  10. Cocos2dx-截屏并设置图片尺寸

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=522 前几天添加微信图片分享的时 ...