前言:
不能对一无所知的事物抱有恐惧或幻想,而是要不断了解,去神秘化!
本节课的收获还是比较大的,主要让我从对“如何做一个引擎的未知”深感恐惧,到对做引擎的东西有了一个较为相对具体些的认知,到认为做出个引擎是有路可循的。
(一)引擎的介绍:
1.误区:曾经认为引擎开发就是图形学。然而,完成一个引擎开发,在图形学知识仅有的5%外其余的广泛都是95%的计算机知识。对于学习来讲,在搭建一个引擎时,要学会设计架构,广泛接触知识,但图形学知识仍是唯一的主线。但是对于工作来讲,是要有一专的!所以还是要在图形学里面挖掘一个深耕领域。
2.虚拟与实时渲染。引擎在有限的时间和空间内架构了一个虚拟世界,可大也可小,可以各具特色功能不一。这是枯燥的知识后面十分吸引我的地方,我们将会更多的观测世界的法则。
实时渲染。这一方面介绍了许多前沿技术,如多线程, 实时光照,多人在线同步(同步帧技术)很多涉及的是网络知识。
3.引擎几大系统:
一个引擎可以从update函数入手。意味着在不同的时间段,程序要再迅速的跑一遍。首先感叹一句,程序员将改变世界。
MVVM:这个要好好的理解一下的。View--->ViewModel<===>Model.。在MVVM框架中,不允许数据和视图直接通信,只能通过ViewModel来通信,而ViewModel观测数据变化,对视图内容进行更新,ViewModel监听视图变化,并能够去通知功能数据发生变化。所以体现了引擎的封装性。
渲染系统:怎么把画面的渲染速度达到需要的帧率。
动画系统:把模型玩起来,动画的过渡如何做。
物理系统:与世界的交互,但是我们要尽可能逼真的描述出逼真的法则。物理这是个巨大的挑战!
GamePlay系统:这个部分是整个游戏的核心架构。由事件系统和脚本系统去表现这个世界的规则,组合成一个工具。
特效系统,相机系统,寻路系统等,这些是非必须的,但是也是体现着设计师,游戏开发者的对于效果的“高定制性”,这怕得是个技美来设计的系统了。
可以看到这几大系统对于开发者要求的能力还是有不同侧重点的。渲染系统是更适合学习现状和职业选择的。
(二)引擎的分层:
在大系统开发的工程中,我们往往倡导“多组合,低耦合”。所以引擎分层来开发可以降低开发复杂度。
引擎的开发主要可以分为五层:
1)Tool Layer工具层 2)Function Layer:功能层 3)Resource Layer: 资源层 4)Core Layer:核心层 5)Platform Layer:硬件软件平台层
整体来看是开发一个引擎的复杂度是很高的,对于不同的层我们都要学习相关的知识,不亚于一个操作系统的开发,所以在学习上来讲,要把握好主干道,然后一专多长!
首先来说,Resource Layer: 资源层,主要管理资产的生命周期,对于完成一个效果我们对于资源的需求其实看起来是最为直观的。几个关键点:(1)资源的高效格式(importing),从resource变成Assets;对于若干MAX,PSD文件若直接放到引擎中,往往要给引擎带来更多的负担,所以要先把他们转化成高效的格式再来为引擎所用,每个资产都有唯一识别号。(2)实时资产管理器。对于战争类游戏,因为玩家要进行实时的操作,故资源也要实时的加载。所以要设置更优的系统的GC要管理资源。
解决了资源层的问题,就要来解决Function Layer:功能层。论一个功能是属于游戏效果,还是属于引擎效果,这方面是存在争议的,所以“梳理逻辑”在功能层中体现的还是很重要的。比如第三人称射击类游戏中:相机的摇晃感。
游戏的进程可以看成是程序的时间进程(unity里成为update)。随着片刻(tick)时间的不断推进,逻辑会改变,场景会改变。Logic+Render构成了一个游戏进程。所以在写逻辑的时候将两者分开写可以更好梳理逻辑。游戏进程更优的组织方式是多线程,所以尽量在设计引擎底层代码的时候从多线程的角度出发,棘手的地方在于各个线程之间可能存在复杂的依赖关系,就不能简单地忽略逻辑把一个线程任务分发给多线程完成!
接下来,说Core Layer:核心层 。核心层可以看成一个庞大的数学库,其要服务于引擎的效率而且对代码质量要求很高。(1)线性代数。一般涉及矩阵和向量的应用。不断的优化引擎需要很多算法知识,比如Carmark计算1/sqrt(x),需要考虑SIMD(单指令多数据指令)(2)数据结构和容器。主要应用于内存管理。C++17,C++21的STL库扩充了更高效率的数据结构是实现方式。所以在把C++98的STL库透彻理解后我觉得可以去体会一下。另外内存管理,硬件也是要解决的一部分方案。紧贴CPU的缓存有时是核心卡点。一般的引擎开发者主要面向功能层和工具层,所以这一部分也是引擎开发者的一道分水岭。
再来谈谈Platform Layer:硬件软件平台层,入口点是掩饰平台差异性。平台目前只了解Windows,但未来也可以去学linux.
最后说下Tool Layer工具层,主要用来提高生成效率,比如图形编辑器,Ui编辑器,shader编辑器。另一个功能是DDC,让其他软件的资产无损导入引擎,需要做资产的导出器,和资产导入器。
作为引擎开发的上层建筑,工具层和功能层,往往是常常被修改的。所以灵活性要大些。但对于核心层和平台层比较稳定,一般不做修改。比如可以用Qt开发界面,C#开发控件。
一些刚下的软件补充
CMake:
编译复杂项目的应用---CMake是一个跨平台的Makefile生成工具。读入所有的源文件(.c;.h;.oc)之后,自动生成makefile。不同的平台和语言都有自己的Make,但是CMake是还是比较出众的。
Git:
Git是一个版本控制系统,是任何软件开发项目中的主要内容。主要用于代码备份和代码版本控制。
结语:
从认识开始,慢慢深入,要学的知识是无尽的。