大象无形:虚幻引擎程序设计浅析
书籍作者:罗丁力 |
ISBN:9787121313493 |
书籍语言:简体中文 |
连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 |
下载次数:5050 |
创建日期:2021-02-14 |
发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
内容简介
《大象无形:虚幻引擎程序设计浅析》以两位作者本人在使用虚幻引擎过程中的实际经历为参考,包括三大部分:使用C++语言进行游戏性编程、了解虚幻引擎本身底层结构与渲染结构、编写插件扩展虚幻引擎。提供了不同于官方文档内容的虚幻引擎相关细节和有效实践。有助于读者一窥虚幻引擎本身设计的精妙之处,并能学习到定制虚幻引擎所需的基础知识,实现对其的按需定制。
《大象无形:虚幻引擎程序设计浅析》适合初步了解虚幻引擎编程,希望了解虚幻引擎本身架构或者希望定制和扩展虚幻引擎的读者。
作者简介
罗丁力,电子科技大学在读学生、腾讯课堂三巫教育课程作者。自UDK开始使用虚幻引擎,有多年的虚幻引擎使用经验。
张三,多年游戏开发经验,资深UE4开发者,三巫社区创始人。
前言
建德若偷,质真若渝。大方无隅,大器晚成。
大音希声,大象无形。夫唯道善贷且成。
——老子,《道德经》
虚幻引擎作为业界一流的次时代引擎,开发了无数成功的作品。在短暂的计算机图形学发展历史上,虚幻引擎历经四代,成为游戏引擎界举足轻重的成员之一。
但是虚幻引擎庞大而复杂的设计,阻碍了许多人学习的步伐。尽管有蓝图系统作为图形化编程,降低了虚幻引擎的上手难度,但是当开发者们走入虚幻引擎的C++范畴,依然会感觉到无从下手。
因此,我决定和我的同事一起来撰写本书。希望能够借助我们微薄之力,帮你理解庞大的虚幻引擎是如何工作的。笔者对本书内容的期望是,这是一本笔者在学习虚幻引擎时希望能够获得的书。同时也请明白,虚幻引擎的代码量为五百万行。本书篇幅不足以分析整个虚幻引擎的所有模块,也无法精确地向读者展示每段代码的意义。相反地,本书立足于:展示引擎基本结构,即尽可能告诉读者“它是这么跑起来的”,对于希望精确研究每一段代码过程的读者,本书会告知你如何寻找到对应的代码。
本书主标题为“大象无形”,《道德经》中有言:大器晚成,大音希声,大象无形。
本书取“伟大的设计对于使用者来说似乎感觉不到存在”和“优秀的系统设计让开发者不需要过多了解原理即能使用”这样的含义。对于虚幻引擎而言,本书中介绍的很多知识,对于普通开发者来说似乎是“没有感觉到存在”的东西,例如引擎的渲染系统,普通开发者几乎只需要简单地完成导入和摆放就能使用,并不需要实际了解渲染系统的工作原理。能够达到这样的效果,恰恰说明了虚幻引擎设计的优秀:能够让开发者不需要了解系统的机制,就能够快速使用其来完成自己的需求,此即“无形”。然而这样优秀的设计是如何完成的?如何扩展这样的设计来让开发者完成自己独特的需求?这是本书希望探讨的内容。
本书由两位作者共同编撰而成,其中罗丁力先生完成了第一部分(除《引擎系统相关类》章节)和第二部分,以及第三部分中《引擎独立应用程序》《自定义资源和编辑器》章节,张三先生完成了第二部分中《引擎系统相关类》章节与第三部分中《插件开发》章节。
笔者才疏学浅,撰写本书仅仅为个人一家之言。欢迎每一位读者对本书提出建议和指正,也欢迎更多的人去撰写虚幻引擎相关的书籍,共同为虚幻引擎的推广、运用做出努力。
感谢UnrealEngine,陪伴我度过了最美好的青春。
阅读之前
你好,欢迎你阅读本书。在这里我希望能向你讲述一些关于阅读本书的约定。首先,这不是一本“虚幻引擎入门宝典”或是“虚幻引擎从入门到精通”。本书的作者们希望把视角集中到那些市面上的教程没有涉及的领域,所以我们不会教你:
(1)如何下载引擎
(2)如何安装引擎和VisualStudio
(3)如何更新引擎
(4)如何申请虚幻引擎账户
我们假定你已经掌握这些知识。并且我们也不会教你:
(1)C++语法
(2)C语言语法
我们认为你在使用虚幻引擎的C++语言进行编程之前,已经掌握了C++的基础语法,包括函数、变量、类、指针与模板。当然,我们会向你解释虚幻引擎中的独有的C++成分,包括C++11标准的一些内容。
如果你已经做好了准备,欢迎开始你的阅读之旅。本书分为以下三个部分:虚幻引擎C++编程这个部分简单介绍虚幻引擎的C++编程方式,你可以通过这个部分回顾、整理你从官方文档学习到的有关使用虚幻引擎进行编程的知识,并给
出了一部分官方文档尚未介绍但可以被使用的库、API与技巧。
虚幻引擎浅析这个部分将会引导读者去研究虚幻引擎源码,并给出笔者认为在深
入使用虚幻引擎进行游戏开发的过程中,可能会需要具备的引擎架构、模块如何工作的知识。换句话说,这个部分介绍虚幻引擎是如何工作的。
扩展虚幻引擎这个部分则是通过介绍虚幻引擎的插件编写,将第二部分的知识运
用起来,让读者不至于觉得这是“屠龙之技”,虽有思辨的乐趣,却没有用武之地。
进而赋予读者定制虚幻引擎以符合自己游戏实际情况的能力。笔者认为这是专业游戏开发者所需要具备的技能。
在每一小节开头,笔者会提供一个常常被问及的问题,然后根据这个问题来阐述接下来的内容,就像这样:
问题
我该如何学习虚幻引擎?
读者可以在阅读完每一个小节后,回顾小节开头的问题,以检验自己是否已经理解了本节的内容。
笔者在这里衷心地祝愿你找到你希望学习的知识,祝你一切顺利!
鸣谢
本书在撰写过程中受到了大量同行、朋友及亲人的帮助,有许多同行无私地贡献了自己的想法、意见及自己宝贵的经验,在此对他们表示真挚的感谢:
非常感谢Netfly和秦春林先生对本书的支持,不仅帮助笔者联系了本书的出版社,也非常认真地审阅本书的稿件,并给出了中肯有效的意见,没有他们的帮助,本书不可能出版。
非常感谢傅建钊先生对本书的帮助,提出了大量有效的意见,并组织了相当多的业内人士共同讨论本书的主题,他的知乎专栏《InsideUE4》对虚幻引擎的剖析同样非常精彩,建议读者可以参考。
同时,也有不少同行针对书中许多主题给出了自己独到的见解,并被整理到书中。
LSFW先生给笔者多次反复讲解渲染框架设计,贡献出了自己对渲染系统的研究成果;黄河水先生、Dest1ny先生撰写了大量博客来分析虚幻引擎的底层架构,给笔者启发颇多;王德立先生帮助本书绘制了插图。还有许许多多同行,在此恕无法一一举名。
感谢三巫社区和EpicGames对本书的出版过程的支持与帮助。
最后,作者之一罗丁力希望感谢BlackRockShooter,感谢她在撰写本书的过程中,对其鼓励与陪伴。
目录
第一部分虚幻引擎C++编程1
第1章开发之前——五个最常见基类2
1.1简述2
1.2本立道生:虚幻引擎的UObject和Actor2
1.2.1UObject类2
1.2.2Actor类5
1.3灵魂与肉体:Pawn、Characterh和Controller6
1.3.1Pawn6
1.3.2Charactor7
1.3.3Controller7
第2章需求到实现9
2.1分析需求9
2.2转化需求为设计10
第3章创建自己的C++类12
3.1使用UnrealEditor创建C++类12
3.2手工创建C++类14
3.3虚幻引擎类命名规则15
第4章对象16
4.1类对象的产生16
4.2类对象的获取18
4.3类对象的销毁18
第5章从C++到蓝图20
5.1UPROPERTY宏20
5.2UFUNCTION宏20
第6章游戏性框架概述22
6.1行为树:概念与原理22
6.1.1为什么选择行为树22
6.1.2行为树原理22
6.2虚幻引擎网络架构26
6.2.1同步26
6.2.2广义的客户端-服务端模型27
第7章引擎系统相关类30
7.1在虚幻引擎4中使用正则表达式30
7.2FPaths类的使用31
7.3XML与JSON32
7.4文件读写与访问33
7.5GConfig类的使用35
7.5.1写配置36
7.5.2读配置36
7.6UE_LOG37
7.6.1简介37
7.6.2查看Log37
7.6.3使用Log37
7.6.4自定义Category38
7.7字符串处理38
7.8编译器相关技巧39
7.8.1“废弃”函数的标记39
7.8.2编译器指令实现跨平台39
7.9Images40
第二部分虚幻引擎浅析45
第8章模块机制46
8.1模块简介46
8.2创建自己的模块47
8.2.1快速完成模块创建47
8.2.2创建模块文件夹结构48
8.2.3创建模块构建文件49
8.2.4创建模块头文件与定义文件49
8.2.5创建模块预编译头文件50
8.2.6引入模块51
8.3虚幻引擎初始化模块加载顺序52
8.4道常无名:UBT和UHT简介55
8.4.1UBT55
8.4.2UHT57
第9章重要核心系统简介62
9.1内存分配62
9.1.1Windows操作系统下的内存分配方案62
9.1.2IntelTBB内存分配器63
9.2引擎初始化过程65
9.2.1引擎初始化简介65
9.3并行与并发67
9.3.1从实验开始68
9.3.2线程71
9.3.3TaskGraph系统73
9.3.4Std::read77
9.3.5线程同步78
9.3.6多进程80
第10章对象模型81
10.1UObject对象81
10.1.1来源82
10.1.2重生:序列化83
10.1.3释放与消亡92
10.1.4垃圾回收94
10.2Actor对象99
10.2.1来源101
10.2.2加载104
10.2.3释放与消亡105
第11章虚幻引擎的渲染系统107
11.1渲染线程107
11.1.1渲染线程的启动108
11.1.2渲染线程的运行108
11.2渲染架构109
11.2.1延迟渲染109
11.2.2延迟渲染在PostProcess中的运用110
11.3渲染过程111
11.3.1延迟渲染到最终结果112
11.3.2渲染着色器数据提供123
11.4场景代理SceneProxy126
11.4.1逻辑的世界与渲染的世界126
11.4.2渲染代理的创建127
11.4.3渲染代理的更新128
11.4.4实战:创建新的渲染代理128
11.4.5进阶:创建静态渲染代理132
11.4.6静态网格物体渲染代理排序148
11.5Shader150
11.5.1测试工程150
11.5.2定义Shader152
11.5.3定义Shader对应的C++类153
11.5.4我们做了什么162
11.6材质163
11.6.1概述164
11.6.2材质相关C++类关系166
11.6.3编译167
11.6.4ShaderMap产生168
第12章Slate界面系统170
12.1Slate的两次排布170
12.2Slate的更新170
12.3Slate的渲染171
第13章蓝图173
13.1蓝图架构简述173
13.2前端:蓝图存储与编辑174
13.2.1Schema174
13.2.2编辑器175
13.3后端:蓝图的编译176
13.4蓝图虚拟机187
13.4.1便笺纸与白领的故事187
13.4.2虚幻引擎的实现189
13.4.3C++函数注册到蓝图193
13.5蓝图系统小结194
第三部分扩展虚幻引擎197
第14章引擎独立应用程序198
14.1简介198
14.2如何开始198
14.3BlankProgram199
14.4走得更远202
14.4.1预先准备203
14.4.2增加模块引用203
14.4.3添加头文件引用203
14.4.4修改Main函数为WinMain204
14.4.5添加LOCTEXT_NAMESPACE定义204
14.4.6添加SlateStandaloneApplication204
14.4.7链接CoreUObject205
14.4.8添加一个Window205
14.4.9最终代码205
14.5剥离引擎独立应用程序207
第15章插件开发208
15.1简介208
15.2开始之前208
15.3创建插件210
15.3.1引擎插件与项目插件210
15.3.2插件结构210
15.3.3模块入口213
15.4基于Slate的界面213
15.4.1Slate简介213
15.4.2Slate基础概念214
15.4.3最基础的界面214
15.4.4SNew与SAssignNew219
15.4.5Slate控件的三种类型220
15.4.6创建自定义控件222
15.4.7布局控件225
15.4.8控件参数与属性227
15.4.9Delegate228
15.4.10自定义皮肤234
15.4.11图标字体239
15.4.12组件继承241
15.4.13动态控制Slot244
15.4.14自定义容器布局248
15.5UMG扩展255
15.6蓝图扩展261
15.6.1蓝图函数库扩展261
15.6.2异步节点264
15.7第三方库引用270
15.7.1lib静态链接库的使用270
15.7.2dll动态链接库的使用273
第16章自定义资源和编辑器276
16.1简易版自定义资源类型276
16.2自定义资源类型278
16.2.1切分两个模块278
16.2.2创建资源类281
16.2.3在Editor模块中创建工厂类281