• 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 


    初学翻译,诚惶诚恐!

    有不足之处,请多多指导!

    万分感谢!


  • 相关阅读:
    Robot Framework自动化测试 ---视频与教程免费分享
    我读《2017软件测试行业调查报告》
    『性能测试』文章大汇总
    作为一个测试,应该怎样分工呢?
    软件测试流程进阶----软件测试总结心得
    JMeter 聚合报告之 90% Line 参数说明
    JMeter使用技巧
    自动化基础普及之selenium的解释
    Robot Framework自动化测试(四)--- 分层思想
    mysql的几种join 及 full join 问题
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5349016.html
Copyright © 2020-2023  润新知