虚幻4蓝图编译剖析(二)

虚幻4编译相关术语和类图

虚幻引擎中的蓝图编译跟常规的程序编译多少是有一些不同的地方,但是基本原理是相通的。我们以普通的类蓝图为例,一个类中包含多个图,每个图中又可以包含一些子图。一个图会包含很多的节点(UEdGraphNode),每个节点可以包含若干引脚(UEdGraphPin)用来连接两个节点。节点又分为执行节点和纯节点(Pure node,上面没有执行引脚)。还有一个模式类(UEdGraphSchema)用于验证语法是否正确等。类图如下所示:

图(UEdGraph)

虚幻4中许多其它的也是使用图来实现的,所以它也有许多的派生类,比如UAIGraph、UAnimationGraph、UAnimationStateMachineGraph、UMaterialGraph等等。类图如下所示:

节点(UEdGraphNode)

一个有向无环图是由无数节点组成的,这个节点就是UEdGraphNode,因为上面提到的图中有支持各种功能的图,所以也就有各种各样的节点,下面我们只摘取一些节点类型,由于我们重点是讲解蓝图编译,所以我们把主要精力放在UK2Node上面,这个节点是所有蓝图节点的基类。类图所示:

引脚(UEdGraphPin)

每个节点上可以有多个节点,输入、输出节点以及参数引脚等等,这些引脚用于记录跟哪些引脚相连、类型、默认值等。

模式(UEdGraphSchema)

用于语法检查(看两个引脚是否可以相连、尝试连接引脚)等功能,如上面所有因为有多种图所以就需要多种模式。蓝图使用的是UEdGraphSchema_K2,动画以及UMG会有自己的Schema。类图如下所示:

FKismetCompilerContext

真正执行编译工作的类,每编译一次就会生成一个新的实例,用来存储编译类的引用以及蓝图等。整个编译过程又分为好多步,是在Compile()函数里面做的。

FKismetFunctionContext

持有编译一个函数的所有信息,包括指向相关图(UEdGraph)的引用、属性以及生成的函数等。

FBlueprintCompiledStatement

编译过程中的单位工作。编译把节点翻译成一系列编译的语句,然后编译器后端会把它编译成字节码。例如变量赋值、goto、调用(call)等。

FBPTerminal

图中的一个终结点(字面量、常量、或者变量引用)。每一个数据引脚都跟其中的一个相关联。你可以自己在NodeHandlingFunctor里面来生成自己的项,用来存储变量、中间结果等。

FNodeHandlingFunctor

用来处理一类节点编译的帮助类,包含用于注册引脚连接的函数(RegisterNets()),以及生成编译语句(FBlueprintCompiledStatement)。通过UK2Node::CreateNodeHandler()函数来创建。如下类图只列举了几个HandlerFunctor。

FBlueprintCompileReinstancer

在编译基本完成的时候,由于类可能已经改变了大小或者有新的属性被添加或删除了,那么编译器需要重新实例化我们刚刚编译类生成的对象实例,生成一个新的,然后使用CopyPropertiesForUnrelatedObjects()函数来把旧的实例中的数据拷贝到新的实例中去。

FKismetCompilerOptions

编译选项,用于指定编译时的设置,包括编译类型(只编译Skeleton, 全部编译、只生成字节码、只生成cpp)等。

Skeleton Class

Skeleton类如其名字定义是一个骨架类,在添加成员变量或者成员函数时都会重新重新(它里面没有代码和自动生成的隐藏变量)

时间: 2024-12-16 03:34:13

虚幻4蓝图编译剖析(二)的相关文章

虚幻4蓝图编译剖析(三)

编译 上面基本的术语已经介绍完了,下面我们进入来进入蓝图编译过程分析.蓝图的编译过程都在FKismetCompilerContext::Compile()函数中.它根据编译的类型不同(上文编译选项中提到的只编译Skeleton.只生成字节码.只生成cpp代码等等)会走不同的分支.我们这里以完全编译来讲解.此处为大概的流程,若想看详细的流程,请参照流程图以及代码. 清除类 类是就地编译的,这意味着同一个UBlueprintGeneratedClass在每次编译的时候都会被清理,并且会重复利用,这样

虚幻4蓝图编译剖析(一)

前言 虚幻引擎中的 蓝图 - 可视化脚本系统 是一个完整的游戏脚本系统, 其理念是,在虚幻编辑器中,使用基于节点的界面创建游戏可玩性元素. 和其他一些常见的脚本语言一样,蓝图的用法也是通过定义在引擎中的面向对象的类或者对象. 在使用虚幻 4 的过程中,常常会遇到在蓝图中定义的对象,并且这类对象常常也会被直接称为"蓝图(Blueprint)".本文从代码的层面讲解虚幻引擎中蓝图的编译(包括编辑部分的代码,使用的版本是UE4 4.13.0),本文假设已经对蓝图已经有一个比较清楚的了解. 编

虚幻4蓝图虚拟机剖析

前言 这里,我们打算对虚幻4 中蓝图虚拟机的实现做一个大概的讲解,如果对其它的脚本语言的实现有比较清楚的认识,理解起来会容易很多,我们先会对相关术语进行一个简单的介绍,然后会对蓝图虚拟机的实现做一个讲解. 术语 编程语言一般分为编译语言和解释型语言. 编译型语言 程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了.程序执行效率高,依赖编译器,跨平台性差些.如C.C++.Delphi等. 解释性语言 编写的程序不进行预先编译,以文本

Android反编译和二次打包实战

作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短.今天就来总结一下Android反编译和二次打包的一些知识.首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果. 本文首先介绍几种Android反编译工具的使用,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali文件实现修改apk逻辑功能的目的. And

libevent源码深度剖析二

libevent源码深度剖析二 --Reactor模式 张亮 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个重要组件和Reactor的对应关系,在后面的章节中可能还会提到本节介绍的基本概念. 1 Reactor的事件处理机制 首先来回想一下普通函数调用的机制:程序调用某函数?函数执行,程序等待?函数将结果和控制权返回给程序?程序继续处理. Reactor释义"反应堆",是一种事件驱动机制.和普通

虚幻4蓝图跑酷游戏制作公开课

#虚幻4# 蓝图跑酷游戏制作公开课,持续更新中. 油管地址:http://t.cn/Rczx3Jv 国内地址:http://t.cn/Rczx3JP 本课程是免费课程,赞助随意,一杯咖啡钱即可,几杯也行,慢慢喝--

boost.asio源码剖析(二) ---- 架构浅析

* 架构浅析 先来看一下asio的0层的组件图.                     (图1.0) io_object是I/O对象的集合,其中包含大家所熟悉的socket.deadline_timer等对象,主要功能是提供接口给用户使用. services服务是逻辑功能的实现者,其中包含提供定时功能的deadline_timer_service.提供socket相关功能的win_iocp_socket_service(windows平台)/reactive_socket_service(其他

虚幻4蓝图快速入门(二)

蓝图用户指南 由于蓝图就是个可视化的脚本系统,那么一个程序语言中的基本概念也就都存在.下面我们简单来介绍下蓝图中的一些基本概念. 变量 概述 Variables(变量) 是存放一个值或引用世界中的一个Object或Actor的属性.这些用户界面 内部访问,或者通过设置使得可以在外部进行访问, 以便应用放置在关卡中的蓝图实例的设计人员可以修改它们的 值. 变量显示为圆角方框,方框内包含了变量的名称: 变量类型 您可以创建各种类型的变量,包括数据类型的变量(比如布尔型.整型及浮点型)及用于存放类似于

虚幻4蓝图快速入门(四)

蓝图跟C++交互 概述 蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改. 有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本示例中突出介绍. 可以通过查看以下内容来快速了解: 虚幻引擎快速入门视频教程第五章,见引用[1] 官方文档 类设置 在类设置的第一部分中,使用C++类向导创建一个名称为LightSwitchBoth 的类. LightSwitchBoth类中的大部分代码设置都和 仅使用C++的Lig