虚幻基础之编译

虽然不像Unity3D那样以多平台支持作为宣传点,虚幻本身依然是多平台支持的,如Windows,IOS,安卓等等。同时为了应对开发和部署的需要,编译的配置也是一个花样繁多的过程。

本篇文章就初步得从概念和工具的角度对虚幻的编译做一定的总结。

文章目录

    • 编译系统
      • UnrealBuildTool
      • UnrealHeaderTool
    • 编译类型
    • 总结
    • 参考

本文使用的环境和工具为:

  • Windows 10
  • ue5
  • Rider or Unreal Engine 2021.3

编译系统

编译是指从源程序到产生目标程序的过程,是指从高级语言翻译成机器可以识读的二进制语言的过程,更通俗来讲,它可以是把我们编写的代码、资源,整合成一个可以运行的可以玩的游戏的过程。

编译通常会涉及到一项强有力的工具——编译器,当然标准的编译流程中还会又预处理阶段(由预处理器负责,是和编译器分开的),现在各种功能强大的IDE通常会把这些工作整合到一起在后台做掉,我们一般只需要点一下Build或者Debug又或者Run即可。

当然,虚幻引擎本身及其游戏内容都是由c++写成,其项目编译当然也会遵循这个过程。只不过,虚幻引擎本身的代码量非常之巨大,属性和方法组成了类,类和类相互配合搭建起模块,模块和模块相互依赖构成了系统,而虚幻引擎中类和模块的数量已经难以计数,所以它也推出了自己的一套管理代码的工具():UnrealBuildTool(UBT,C#,编译虚幻的各个模块,处理依赖),和UnrealHeaderTool(UHT,C++,头文件解析和代码生成,为反射系统提供支持)。

UnrealBuildTool

UBT的源码位于:

UE_5.0\Engine\Source\Programs\UnrealBuildTool

代码是用C#写成,完整开发的话需要安装相应的.Net桌面开发框架,需要的可以到相应位置查找(一般我们不会去动这个工具,但是相应的,如果需要做一些轻量的修改,可以到BuildConfiguration.cs中探索可供用户配置的编译选项)。而对应的可执行程序的位置在:

UE_5.0\Engine\Binaries\DotNET\AutomationTool

这个才是真正编译好的,发挥作用的工具。

对于UBT,我们需要知道的是,当我们去Build或者Rebuild项目时(以及右键点击项目的.uproject文件选择Generate Visual Studio project files时),就会去运行UnrealBuildTool.exe,并传入几个参数(Main函数的参数):

static class UnrealBuildTool
{...private static int Main(string[] ArgumentsArray){...}
}

这里的ArgumentsArray即是通过采样C++构建系统NMake的Build Command Line来确定几个参数,主要是项目名称,编译的Target(目标),目标平台等等。

请添加图片描述

然后读取build.cs,确定模块与模块之间的依赖关系(需要去编译哪些模块,需要忽略哪些模块的编译工作,模块的没有变动的话会跳过)。

随后,UBT调用UHT执行头文件解析和代码生成的工作,UHT会根据反射标签生成相应的代码(如对应GENERATED_BODY()的宏替换代码就位于生成的.generated.h中,又如UPROPERTY()标记的属性被序列化到蓝图中,等等,详情参考讲解反射的相关文章)。

最后,UBT通过确定好的依赖关系调用编译器编译变更模块的C++代码。

UnrealHeaderTool

UHT的源码位于:

UE_5.0\Engine\Source\Programs\UnrealHeaderTool

UHT工具与虚幻的反射机制息息相关,可以这样说,UHT是构建于虚幻UObject系统基础上的宏生成和替换工具(当然,还是用原文“头文件解析工具”更贴切)。

反射是很多游戏引擎都依赖的特性,像Unity3D借用了C#的反射。当然不同的是,C++本身并不支持反射(原生C++有RTTI,Runtime Type Identification,即运行时类型识别),而是虚幻在普通C++上实现了这样的一套反射机制。这样,便使运行时获取类的元数据变得简单,从实现GC,序列化等一些引擎需要的功能。

举个例子,用UPROPERTY()标记的属性,可以序列化在蓝图中,通过其中的说明符可以进一步定制该属性的特性(详情参阅说明符关键字相关文章)。

编译类型

编译虚幻项目时,可以是简单的选择项目,然后右键Build,然后运行Debug;但是此时可能就会遇到一些问题,为什么有些代码我打了断点,却无法进入断点呢?

这个就是虚幻C++项目的一个小坑了,关键就在于编译的配置。

我们可以发现在每个模块都有对应的.Target.cs,包括我们的游戏模块。其内容就是对该模块应该面向哪一种编译的目标。

这里这个编译的Target,我们可以理解为我们出于什么目的来编译这个模块,是为了让别人在游戏中直接使用?还是别人可以在编辑器中应用调整该模块?等等。

例如我们的游戏模块,我们知道这个游戏是冲着打成包给别人玩的,那么就有专门的.Target.cs

Type = TargetType.Game;

这里的Target为[empty]

此外,这个游戏模块还要供我们在编辑器内编辑使用,可能还会用到调试,那么还有另外一个__Editor.Target.cs

Type = TargetType.Editor;

这里的Target为Editor。

此外Target的可选项还有Client和Server,分别对应着客户端和服务器的编译目标。

Target描述
[empty]不带编辑器的一个独立可执行版本,需要提前打包烘培内容资源
Editor在虚幻编辑器里打开并可编辑游戏项目,所有代码的更改也会反映到编辑器中
Client多人联网功能中的客户端版本,需要在项目中提供__Client.Target.cs(参照__Editor.Target.cs的写法)
Server多人联网功能中的服务器版本,需要在项目中提供__Server.Target.cs(参照__Editor.Target.cs的写法)

除了Target外,还有另外一关键字需要注意——State(通常State在前,Target在后,即[State] [Target])。

State是用来描述我们当前引擎和游戏项目的状态,我们的游戏要准备打包发行了,就使用Shipping;我还处在游戏开发阶段,需要通过代码进行某些游戏代码的调试,就使用DebugGame;而若是只需要通过编辑器的反射来查看代码的更改的话,那么Development一般就可满足条件(这也是默认的状态,虚幻官方推荐新手以蓝图开发为主,代码开发为辅)。

StateEngineGame描述
DebugDebugDebug会同时去构建引擎和游戏两者的代码,是最全面的构建,但同时也会比较费时间
DebugGameReleaseDebug以最优的方式构建引擎,同时保持游戏部分的代码支持调试,适用于仅调试代码的模式
DevelopmentReleaseRelease可以在编辑器内通过反射的方式查看代码所带来的更改,是开发和性能最平衡的模式
ShippingReleaseRelease最佳性能配置,用于交付游戏,无控制台命令、统计数据和性能分析工具
TestReleaseRelease同Shipping模式,但是启用了控制台命令、统计数据和性能分析工具

这两个关键字大部分情况都可以组合使用,但是还是有一些例外情况。

编译配置——编译解决方案(有引擎源码版),此时是将引擎源代码和游戏项目的源代码一同编译,其可选配置如下:

DebugDebugGameDevelopmentShippingTest
[empty]
Editor
Client
Server

编译配置——编译项目(无引擎源码版),此时是将游戏项目的源代码单独编译,其可选配置如下:

DebugDebugGameDevelopmentShippingTest
[empty]
Editor
Client
Server

总结

UBT也好,UHT也好,甚至于IDE也好,作为工具来说是他们都是非常强大可靠的,同时其强大的代价就是其内部项目的驳杂,会在我们希望深入内部时造成一定的阅读学习困难。

好在,一方面,作为游戏开发者、引擎使用者来说,我们不是必须要把这些工具的内部代码理解通透,而是掌握其基本特性和工作流程已是不错,随着分工不断得细化,我们程序也会走向不同的分工,可能确实有一些同时需要切实掌握并且具备修改的能力,但是对于大部分Gameplay和System的编程者来说,能够完全掌握本文及链接所述内容已是不俗。

另一方面,网络上也越来越多得出现技术和知识的共享者,本文的成文就是综合多方阅读资源进行总结的结果,这里也表达我的谢意。

最后,如果文中有一些技术性或者表述性的错误,还请大家多予指点。

参考

虚幻 5.0 Documentation - Build Configurations Reference

虚幻 5.0 Documentation - Compiling Game Projects

知乎作者 大钊 的文章《InsideUE4》

知乎作者 雪流星 的文章《虚幻编译系统总结》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面了解虚幻引擎 5

Incredibuild 与 Epic 合作密切,并与虚幻引擎深度集成,因此对于虚幻引擎 5 的发布,我们也是既期待又兴奋。不得不说,虚幻引擎 5 没有辜负我们的期待,在技术上达到了真正的“虚幻”级别! 虚幻引擎 4 的进步…

虚幻引擎5安装踩坑记录

1、The required library hostfxr. dll could not be found. 通过以下链接下载并安装 Download .NET Core 3.1 (Linux, macOS, and Windows) 以我的安装路径为例,将以下hostfxr.dll (也就是报错的未找到文件)复制到虚幻引擎对应的文件夹中…

虚幻浏览器插件 中文输入

WebView 输入法设置 如上所示,在Switch Input Method 项勾选。然后运行项目即可效果如下。 git下载地址: https://github.com/aSurgingRiver/WebView 上一篇 虚幻浏览器插件 页面跳转 目录 下一篇 虚幻浏览器插件 加载透明网页

虚幻4基础人物移动

新建一个文件夹,命名Blueprint。 新建角色,玩家控制器,游戏模式基础。在世界场景中对应(世界场景设置找不到左上角窗口下拉菜单里) 点击新建的角色,左边点击网格体,右边骨骼网格体选择自己倒入…

开源“模仿”ChatGPT,居然效果行?UC伯克利论文,劝退,还是前进?

原创:谭婧ChatGPT 从“古”至今,AI的世界,是一个开源引领发展的世界。 虽然Stable Diffusion作为开源的图像生成模型,将图像生成提到了全新境界,但是ChatGPT的出现,似乎动摇了一些人的信念。 因为ChatGPT是…

没有这些,别妄谈做ChatGPT了

文|卖萌酱 转自 | 夕小瑶的卖萌屋 ChatGPT破圈爆火后,越来越多人开始问: “啥时候出现中国版的ChatGPT?” 国内学术界和工业界,都纷纷躁动起来——百度、阿里、字节等大厂纷纷喊口号,一众创业公司也开始争做…

2023年中国AI芯片行业市场现状及未来发展趋势预测

2023年AI芯片报告汇总了60家国产AI芯片厂商,大致按如下应用类别进行归类:云端加速、智能驾驶、智能安防、智能家居、智能穿戴、其它AIoT。对于每一家筛选的公司,我们从主要产品、核心技术、应用场景、市场竞争力、发展里程碑等方面对公司进行…

ChatGPT Plugins引发AI行业“洗牌”,与元宇宙双向奔赴

三月迎来AIGC新品爆发大热潮,据不完全统计,在两周内GPT-4、微软Microsoft 365 Copilot、Midjourney V5、Google PaLM API、英伟达新显卡接连出场,创新工场CEO李开复、美团联合创始人王慧文、阿里副总裁贾扬清、搜狗创始人王小川等纷纷进军&am…

ChatGPT Plugins内幕、源码及案例实战(二)

第6章 ChatGPT Plugins内幕、源码及案例实战 检索插件的API需要以下环境变量才能工作,如表6-2所示。 ChatGPT检索插件示例中,“.well-known”目录里面的ai-plugin.json是一个插件的说明文档,插件名为Retrieval Plugin,用于搜索用户的文档(如文件、电子邮件等),该插件…

ChatGPT Plugins内幕、源码及案例实战(三)

ChatGPT Plugins内幕、源码及案例实战(三) ChatGPT Plugins内幕、源码及案例实战 6.4 ChatGPT Retrieval Plugin全流程内幕解析 以ChatGPT检索插件为例,我们讲解一下它整个的流程,让大家有一个比较明确、清晰的统一认知:  数据存储:设立的前提是你有文档,会有一些文…

ChatGPT Plugins内幕、源码及案例实战

ChatGPT Plugins内幕、源码及案例实战 6.1 ChatGPT Plugins的工作原理 本节主要跟大家谈ChatGPT的插件(Plugins),这个内容非常重要。现在很多企业级的开发,一般都会基于ChatGPT插件进行一些服务的封装,相当于开发了一个…

各大平台仅存的优势就只剩下数据了,OpenAI推出ChatGPT Plugins

部分结论 *本文2300字左右 各大平台仅存的优势就只剩下数据了AI as a service会加速行业迭代平台App会继续裁员...其实OpenAI一开始就是冲着开发者去的... 现象 我们首先说一下事件,再讲一下笔者看到的其他背后的东西。 2023年(北京时间)3月2…

ChatGPT-Plugins-Searchable

ChatGPT Plus 用户应该都知道Plus已经开放了插件功能,但是在插件商店里存在一个较大的问题插件数量超过100款,却没有便捷的搜索功能。 而我们在查找一款插件时,需要从插件商店的第一页点击到最后一页一个个找,显然这非常的麻烦。 …

ChatGPT plugins GitHub Copilot X【附申请链接】

省流总结 ChatGPT 插件系统 插件意味着无限可能,各种应用场景。 ChatGPT 发布插件系统,补齐所有短板 ChatGPT 插件系统是一项新功能,它使语言模型能够与外部工具和服务进行交互,提供对信息的访问并实现安全、受约束的操作。它由…

ChatGPT Plugins的开源解决方案

近期,来自清华大学、中国人民大学、北京邮电大学、UIUC、NYU、CMU 等高校的研究人员联合 OpenBMB 开源社区、知乎、面壁智能公司探索了基础模型调用外部工具的课题,联合发表了一篇 74 页的基础模型工具学习综述论文,并发布了开源工具学习平台。 该团队提出了基础模型工具学…

ChatGPT Plugins内幕、源码及案例实战(一)

ChatGPT Plugins内幕、源码及案例实战 6.1 ChatGPT Plugins的工作原理 本节主要跟大家谈ChatGPT的插件(Plugins),这个内容非常重要。现在很多企业级的开发,一般都会基于ChatGPT 插件进行一些服务的封装,相当于开发了一个代理(Agent),把一些服务或者API封装在里面,然后…

chatgpt赋能python:PythonUDS:让你的汽车掌握更多技能

Python UDS:让你的汽车掌握更多技能 UDS(Unified Diagnostic Services)是一种汽车电子控制单元(ECU)通信协议,用于车辆的诊断和测试。Python UDS是用Python编程语言实现的UDS客户端和服务器实现&#xff0…

ChatGPT技术链

一切都要从 ChatGPT 的横空出世说起...... 曾经一片祥和的 NLP 社区,被这个突如其来的 “怪物” 吓到了!一夜之间,整个 NLP 圈发生了巨大的变化,工业界迅速跟进,资本 “狂飙”,开始了复刻 ChatGPT 之路&am…

当ChatGPT-4遇到移动开发

3月15日,#GPT4做一个网站只要十秒#登上热搜。 当地时间周二(3月14日),人工智能研究公司OpenAI公布了其大型语言模型的最新版本——GPT-4。 几乎所有的办公室案头工作,GPT-4无所不能。比如,10秒钟就能做出…

对于Android程序员的选择方向、ChatGPT真有你需要的答案

前言 今年似乎没有开春的温暖,去年的严寒蔓延到了现在,不知道会持续多久。 正因为这样还有不少Android开发在等待着,我也不清楚这些人还在等待着什么,像极了一个不撞南墙不知道疼的“小孩”。 今天打开搜索引擎映入眼帘的还是去…