游戏引擎架构#1 历史、现状、架构、团队
背景:
作为游戏开发从业者,从业务到算法到语言到框架到引擎,积累了一些知识和经验,特别是在看了好几遍《游戏引擎架构》后对引擎的架构感触颇深。
近段时间对引擎剖析的想法也较多,正好借着书本对游戏引擎架构做一个完整分析。此书用简明、清楚的方式覆盖了游戏引擎架构的庞大领域,巧妙地平衡了广度与深度,并且提供了足够的细节,使得初学者也能很容易地理解其中的各种概念。
目标是掌握游戏引擎架构知识,方法是跟随《游戏引擎架构》这本书、结合引擎源码、自己的经验,分析游戏引擎的历史、架构、模块。最后通过实践自主引擎的开发来完成对引擎知识的掌握。
游戏引擎知识面深而广,所以对这系列的文章书编写范围做个保护,即不对细节进行过多的阐述,重点剖析的是架构、流程以及模块的运作原理。
概述:
文章分为五个部分:
- 游戏引擎历史
- 现代引擎概览
- 计算机图形技术发展史
- 游戏制作团队
- 运行时引擎架构概述
正文:
此篇分四个主题来概述一下游戏引擎的基础知识,我会分别从历史、现状、架构、团队,这四个方面来阐述。
游戏引擎历史
有些同学会问,为什么要讲历史?为什么要讲现状?那是因为了解历史和现状能帮助我们更好的理解引擎的每个部分。
实际上,每每当你回顾历史,就会发现它是由很多巧合构成的,当知道它的来龙去脉时,我们也就能更好的理解“今天为什么它成为这个样子”。
我认为游戏引擎这个词语用的非常好,它很好的概括它在游戏开发中的地位。
我们说所有的程序都可以用工具两个字来描述,那么游戏引擎到底带给了我们什么,才让它成为今天人们普遍关注的焦点呢。
十几年前的游戏都很简单,容量大小都是以兆计的,通常一款游戏的开发周期在8到10个月左右,最主要的是每款游戏开发都需要重头编写代码,期间存在着大量的重复劳动,耗时耗力。
慢慢地开发人员总结出些规律,某些游戏逻辑总是有些相似的代码,可以做成模块重复使用,这样就可以大大减少游戏开发周期和开发费用。
一开始,只是做些低耦合的通用方法,然后逐渐形成了模块,接着演变成了复合型框架,最后形成了大型软件工程,即现在的游戏引擎。
Id Tech 引擎发展史
说到引擎发展史不得不说ID software这家游戏公司,很早就开始开发起游戏,从一个小游戏到游戏移植再到《Wolfenstein 3D》,游戏技术让这家公司从无到有,不断创造出一个又一个技术巅峰。
最后《Wolfenstein 3D》成了游戏引擎的始祖,它不但开创了3D 射击游戏世界,而且程序也被其他游戏所使用。
对ID公司来说《Wolfenstein 3D》只是小试身手,DOOM(毁灭战士)游戏引擎才是引擎技术的代表,DOOM使用的引擎正是Id Tech 1。
在DOOM发布后,获得了350万的销量,为ID公司带来了滚滚财源。
更重要的是DOOM成了ID公司第一款用于商业授权的引擎,这为ID公司增加了一条创收之路,即商业引擎之路从此开始。
引擎从Id Tech 1到Id Tech 5,每一代升级都是质的飞越。游戏Id Tech引擎也制作出了很多优秀的游戏,包括《Quake》、《半条命》、《反恐精英》等。
Unreal 引擎发展史
EPIC公司在1998年发布了Unreal引擎,同时《虚幻》这款FPS游戏也发布出来,画面精致绚丽得到大众的认可。
不仅如此,重要的是Unreal引擎得益于画面精美和DX规范的通用性,很快就得到了许多游戏公司的支持。而且,由于Unreal引擎的通用性,除了游戏,它还广泛使用在3D建模、建筑设计、动作捕捉、电影特效等等领域。
Unreal引擎一战成名后,便开启了升级之路,引擎从Unreal 1到 Unreal 5,凭借着优秀的画质表现、适中的显卡要求、强大的自定义工具和一站式配套开发使得Unreal具备了各个平台各种游戏的适应性,因此越来越多的游戏采用Unreal引擎。目前已成为全球最流行的游戏引擎之一。
Unity 引擎发展史
Unity在2005年6月时发布了1.0版本的引擎。
最初,是在2005年苹果公司的全球开发者大会上对外公布并开放使用,当时只是一款面向Mac OS X平台的游戏引擎。
由于其引擎的易用性,受到广大开发者的喜爱,之后Unity公司便开启了快速升级之路,用了10年时间从1.0一路升级到5.0。
鉴于引擎的更新速度逐渐加快,Unity官方决定不再在其版本号中标注纯数字,而改用年份与版本号的复合形式,如Unity 2018.2,发布时间为2018年7月10日。
截止目前使用Unity引擎开发出了的手机游戏,无论是在数量上还是在流行度上,都是所有引擎中最多也是最受欢迎的。
随着显卡性能越来越强,游戏的画质越来越高,游戏开发周期也越来越长,通常都会达到3到5年,自行开发游戏引擎的话时间还会更长,所以大多数游戏公司还是选择购买现成的游戏引擎,简化游戏的开发过程。
现代引擎概览
雷神之锤引擎,与游戏业务密切融合,它的第一款游戏是《德军总部》,后相继开发了《毁灭战士》、《雷神之锤》等游戏。Source引擎中的技术也能追溯到雷神之锤的技术。原始雷神之锤引擎的架构相当优秀并且整洁。这些代码都是非常好的例子,能说明工业级游戏引擎是怎样炼成的。
虚幻引擎,从《虚幻》游戏开始进化,进化到虚幻4代引擎时,号称是业界最好的工具和最丰富的引擎功能。它有方便且强大的着色器制作工具,还提供一个方便快捷的图形用户界面编辑器,虚幻引擎以其全面的功能及内聚易用的工具著称。但虚幻引擎并非完美,大部分开发者都需要用不同方式优化它,才能在具体的目标硬件上运行。可贵的是虚幻引擎拥有极为强大的原型制作工具和商业游戏平台,可用来制作几乎任何3D游戏。
Source引擎,《半条命2》起家的游戏引擎,其图形能力和工具套件可与虚幻引擎4娉美。
寒霜引擎,是从《战地:叛逆连队》开发开始的,之后成为艺电应用最广泛的引擎。寒霜引擎拥有强大的统一资产创作工具FrostEd,以及强大的Backend Services工具管道。
CryEngine,原本是为NVIDIA开发的技术演示程序。确立这个技术具有潜力后,就把演示程序改为了完整的游戏《孤岛惊魂》,最后演化成了游戏引擎。经过多年迭代,CryEngine3已经是一个强大的资产创作工具,具有丰富的功能并拥有高品质的图形渲染引擎。
索尼的PhyreEngine,专为支持索尼的PS2,PS3,PS4等平台提供技术服务。PhyreEngine3.5让开发者能使用PS3 Cell架构的高度并行能力、PS4的高级演算能力,以及包括其他世界编辑器和开发工具。
微软的XNA Game Studio,XNA基于微软的C#语言并使用Visual Studio管理游戏项目资产。
Unity,支持广泛的平台,它的主要设计目标是容易开发及跨平台游戏开发。因此它提供了容易使用的整合编辑环境,我们可以在此环境中创建及处理游戏世界中的资产及实体,并能快速地在编辑器中浏览游戏运行的样子,同时也提供了直接在目标硬件上运行的功能。不仅如此它还提供了全面的资产调节管道,可以为每个平台独立调节性能与品质以达到两者的平衡。
计算机图形技术发展史
我把计算机图形技术发展史分为了四个部分,它们分别是,硬件发展史、图形API发展史、图形软件发展史、以及图形技术发展史。
图形硬件发展史
图形硬件,最初由SGI公司(Silicon Graphics Inc)开发的IRIS(综合光栅成像系统)受到市场热捧,它使用2MB内存的8 MHz M68000处理器,定制1024x1024帧缓冲器和几何引擎。其最初的市场定位为3D图形显示终端。随着市场策略的推进,SGI公司在电影、电视等领域的发展迅速并且它们的产品受到欢迎。
接着是Sun微系统公司,它于1982年由安迪·贝托尔斯海姆与其他同门研究生在斯坦福大学成立。贝托尔斯海姆最初将SUN计算机设计为斯坦福大学网络(因此缩写为“SUN”)的个人CAD工作站。它是围绕Motorola 68000处理器设计的,具有Unix操作系统和虚拟内存,并且与SGI一样,具有嵌入式帧缓冲区。后来的发展包括计算机服务器和基于RISC处理器架构和一系列软件产品(如Solaris操作系统和Java平台)构建的工作站。
GPU英文全称Graphic Processing Unit,20世纪70年代末GPU概念被提出,它的优点是具有高并行结构,所以GPU在处理图形数据和复杂算法方面由比CPU更高的效率。CPU大部分面积为控制器和寄存器,与之相比,GPU拥有更多的ALU(Arithmetic Logic Unit,逻辑运算单元)用于数据处理,这样的结构适合对密集型数据进行并行处理。GPU采用流式并行计算模式,可对每个数据进行独立的并行计算,所谓“对数据进行独立计算”即:流内任意元素的计算不依赖于其他同类型数据,例如,计算一个顶点的世界位置坐标,不依赖于其他顶点的位置,所谓“并行计算”是指“多个数据可以同时被使用,多个数据并行运算的时间和1个数据单独执行的时间是一样的”。所以,在顶点处理程序中,可以同时处理N个顶点数据。目前,线性代数,物理仿真和光线跟踪算法都已经成功的一直到GPU上。
第一代GPU,NVIDIA于1998年宣布Modern GPU研发成功,这标志着第一代Mondern GPU的诞生,第一代GPU包括NVIDIA TNT2,ATI的Rage和3Dfx的Voodoo。这些GPU可以独立CPU进行像素缓存区的更新,并可以光栅化三角面片以及进行纹理操作,但是缺乏三维顶点的空间坐标变换能力,这意味着“必须依赖与CPU执行顶点坐标变换的计算”。这一时期的GPU功能非常有限,只能用于纹理组合的数学计算或者像素颜色值得计算。
第二代GPU,NVIDIA于1999年推出一款显示核心代号NV10的geforce 256,率先将硬体T&L整合到显示核中。T&L原先由CPU负责,或者由另一个独立处理机处理。这次整合T&L是一大进步,原因是显视核心从CPU接管了大量工作。硬件T&L引擎带来的效果是3D 模型可以用更多的多边形来描绘,这样就拥有了更加细腻的效果。而对光照来说,CPU不必在计算大量的光照数据,直接通过显卡就能获得更好的效能。同时,这一阶段的GPU对于纹理的操作也扩展到了立方体纹理(Cube Map)。NVIDIA的GeForce MAX,ATI的Radeon 7500等都是在这一阶段研发的。
第三代GPU,2001年是第三代Modern GPU的发展时期,这一时期研发的GPU提供Vertex Programmability (顶点编程能力),如GeForce 3,GeForce 4Ti,ATI 的8500等。这些GPU允许应用程序指定一个序列的指令进行顶点操作控制,这是一个具有开创意义的时期,这一时期确立的GPU编程思想一直延续到今天,不但深入到工程领域帮助改善人类日常生活(医疗、地质勘探、游戏、电影),而且开创或延伸了计算机科学的诸多研究领域(人体绘制、光照模拟、人群动画、通用计算等)。同时Direct8和OpenGL都本着与时俱进的精神,提供了支持Vertex Programmability的发展。不过,这一时期的GPU还不支持像素级的编程能力,即Fragment Programmability(片段编程能力)。
第四代GPU,发展时期从2002年末到2003年。NVIDIA的GeForceFX和ATI Radeon 9700同时在市场的舞台上闪亮登场,这两种GPU都支持顶点编程和片段编程。同时DriectX和OpenGL也扩展了自身的API,用以支持顶点编程和片段编程。自2003年起,可编程图形处理器正式诞生,并且由于DirectX和OpenGL契而不舍的追赶潮流,导致基于图形硬件的编程技术,简称GPU编程,也宣告诞生。
图形API发展史
在 1980 年代,开发可与各种图形硬件配合使用的软件是一项真正的挑战。软件开发人员为每个硬件编写自定义接口和驱动程序。这个代价是昂贵的,将导致工作量成倍增加。到 1990 年代初,Silicon Graphics (SGI) 是工作站 3D 图形领域的领导者。他们的 IRIS GL API成为行业标准,比基于开放标准的 PHIGS 使用更广泛。
OpenGL、DirectX、Vulkan、Metal等都属于图形API,它的本质是封装好的显卡接口,用来将应用程序与显卡驱动联系起来。有了图形API我们可以仅仅调用它的函数来更改渲染状态、缓存顶点数据、开始绘制等等,而如果没有它,我们就需要直接调用显卡驱动的接口来进行渲染,这会涉及到非常多的硬件接口,例如对寄存器的操作,相当繁琐。一般来说我们都不会希望在渲染的同时还要去关注对硬件的控制。
目前比较常用的图形API:
- OpenGL
- OpenGL ES
- OpenCV
- DirectX
- Metal
- Vunkan
OpenGL(Open Graphics Library),是一个跨平台、跨语言的编程图形框架,主要用于windows、mac等PC端。它将计算机资源抽象成一个个OpenGL对象,对这些资源的操作抽象为一个个OpenGL指令。
OpenGL ES(OpenGL for Embedded Systems),OpenGL三维图像API的子集,主要是针对嵌入式设备的图形处理,比如安卓、iOS等。它在OpenGL之上去除了许多不必要的接口,以及性能较低的接口,并且兼容了GLSL着色器语法。
OpenCV(Open Source Computer Vision Library),它与 OpenGL是图形API中两个大的分支,类似于iOS中的OC和swift,是两个不同的方向。OpenCV主要用于识别技术,例如人脸识别、身份识别、物体识别等,该API的使用需要与人工智能相结合。目前市面上用的最多的识别三方是 face++,且是收费的,支付宝等大厂的识别功能也是集成的face++。
DirectX,仅支持Windows平台,由很多API组成,是一个多媒体处理框架,并不是单一的图形API。该框架可以大致分为4类,显示、声音、输入、网络。
Metal,是苹果为了解决3D渲染问题而推出的框架,是为游戏开发者提供的新的平台技术,并且它将3D渲染图像的性能提高了原来的10倍。苹果系统中的CoreGraphics、CoreAnimation、CoreImage框架在2018年以前是基于OpenGL ES封装的,在2018年以后是基于Metal封装的。
Vunkan,Vulkan API 最初被 Khronos 称为“下一代 OpenGL 计划”,与 OpenGL、Direct3D 11 和 Metal 相比,Vulkan 旨在提供更高的性能和更平衡的 CPU 和 GPU 使用,并为应用程序提供相当低级别的 API 和并行任务。
OpenGL历史
SGI 的竞争对手(包括 Sun Microsystems、Hewlett-Packard 和 IBM)也能够将 PHIGS 标准扩展支持的 3D 硬件推向市场,这迫使 SGI 将 IrisGL 版本作为公共标准开源,称为 OpenGL。
然而,SGI的许多客户从 IrisGL 到 OpenGL 的转变需要大量投资。此外,IrisGL 具有与 3D 图形无关的 API 函数。例如,它包括一个窗口、键盘和鼠标 API等。其原因是,它是在 X Window System 和 Sun 的 NeWS 之前开发的。而且,由于许可和专利问题,IrisGL的库不适合开放。因此这个转变难度相当大,SGI公司付出了艰辛的努力,得到了市场的认可。
IrisGL 的限制之一是它只提供对底层硬件支持的功能的访问。如果图形硬件本身不支持某个功能,则应用程序将无法使用它。OpenGL 通过提供硬件不支持的功能的软件实现来克服这个问题,允许应用程序在相对低功耗的系统上使用高级图形。
OpenGL标准化了对硬件的访问,将硬件接口程序(设备驱动程序)的开发责任推给了硬件制造商,并将窗口功能委托给了底层操作系统。有了这么多不同种类的图形硬件,通过为软件开发人员提供一个用于 3D 软件开发的更高级别的平台,让它们以这种方式使用同一种语言产生了显着的影响。
OpenGL在1992年由SGI(Silicon Graphics Inc)发布。起初它是作为Iris GL的一个替代品而出现的。Iris GL是SGI的专用图形API,由于它有一些与3D图形无关的API以及一些专利等原因,不适合作为行业的广泛标准,于是SGI编写了OpenGL 1.0规范。在之后,每隔一段时间OpenGL便会出现新的增量更新。
- 1992年,SGI发布了OpenGL 1.0。
- 2003年7月,OpenGL ES 1.0发布,它是专为手机、平板电脑、游戏主机等嵌入式系统设计的一个OpenGL API子集。
- 2004年9月,SGI发布了OpenGL 2.0,这其中就有GLSL 1.0(OpenGL Shading Language)的面世,这是一种类C语言,可以用它对固定管线的顶点/片段着色器进行编程。与之相伴的还支持了MRT(Multiple render targets)和NPOT(Non-power-of-two textures)。
- 2006年7月,OpenGL API规范的控制权转交给非盈利组织Khronos团队。
- 2008年8月,OpenGL 3.0发布,支持FBO(Framebuffer Objects)以及VAO(Vertex Array Objects)等多个功能,同时支持了非常多的特性,并且从这版开始OpenGL支持了向后兼容。
- 2009年8月,OpenGL 3.2发布,废弃了固定渲染管线,发布了核心模式(Core Profile),这种模式的灵活性与效率更高,之后的迭代也都是基于这个核心架构,同时版本中增加了新的着色器阶段:几何着色器。
- 2010年3月,OpenGL 3.3和OpenGL 4.0一起发布,带来了新的标准规范,自此之后GLSL的版本号与OpenGL版本号保持一致,即GLSL 3.3/4.0,同时新增了曲面细分着色器。
- 2017年7月,OpenGL 4.6发布,增加了SPIR-V 着色器,SPIR-V 使高级语言前端能够以标准化的中间形式发出程序,供 Vulkan、OpenGL 或 OpenCL 驱动程序摄取。
Vulkan历史
Vulkan于Khronos在GDC 2015上首次公开,它也曾被叫做是“Next Generation OpenGL Initiative”(glNext),旨在对OpenGL和OpenGL ES的一次重新设计,将两者统一到一个API中。
与OpenGL相同它也是一个跨平台的2D、3D图形API,不同的是它是一个Low Level图形API,即会开放出更多与内存控制相关的接口。
Vulkan能较好的支持多线程并行(OpenGL4.0+是为单线程设计的),这使得它的操作和维护比OpenGL复杂得多。另外OpenGL使用GLSL来编写着色器,每个显卡商需要为GLSL单独编写编译器来转换为在显卡上运行的机器码。在这点上Vulkan不同,它会先由操作系统把GLSL预编译为一种名为SPIR-V(Standard Portable Intermediate Representation)的中间码,再由显卡商编写Vulkan驱动程序对GPU进行一些特定的优化,加载速度变快了还节省了显卡商的开发及维护成本。这和Direct3D的HLSL预编译很像。
- 2016年2月,Vulkan 1.0发布。
- 2018年2月,Khronos发布MoltenVK,可以理解为MoltenVK是用Metal实现了Vulkan的API,这使得macOS和iOS也能支持Vulkan了。虽然绕了趟远路,但从Dota2的表现上来看,依旧比OpenGL高出了50%的帧率。
- 2018年3月,Khronos和GPUOpen公开V-EZ项目,它是“Easy Mode”的缩写,是一个基于Vulkan的中间层,相比于Vulkan它保留了Vulkan的大部分API,提供了更简单的内存管理API,封装了诸多底层细节。旨在开发者更容易上手Vulkan。
- 2018年3月,Vulkan 1.1发布。支持了HLSL语法以及光线追踪。可以更好的模拟DirectX 12。spirv更新至1.3。
- 2020年1月,Vulkan 1.2发布。新增了23项扩展以及更好的支持HLSL。
Direct3D历史
Direct3D 是 Microsoft Windows 的图形应用程序编程接口 (API)。作为 DirectX 的一部分,Direct3D 用于在性能很重要的应用程序(例如游戏)中渲染 3D 图形。Direct3D 使用硬件加速(如果它在显卡上可用),允许对整个 3D 渲染管道进行硬件加速,也支持仅部分加速。
Direct3D 公开了 3D 图形硬件的高级图形功能,包括 Z 缓冲、W 缓冲、模板缓冲、空间抗锯齿、alpha 混合、颜色混合、Mipmapping、纹理混合,剪裁、剔除、大气效果、透视校正纹理映射、可编程 HLSL 着色器等其他图形效果。与其他 DirectX 技术的集成使 Direct3D 能够提供视频映射、2D 覆盖平面中的硬件 3D 渲染甚至精灵等功能,从而在交互式媒体关系中提供 2D 和 3D 图形的使用。
Direct3D 是一种立即模式图形 API。它为每个显卡的 3D 功能(转换、剪辑、照明、材质、纹理、深度缓冲等)提供了一个低级接口。立即模式呈现三个主要抽象:设备、资源和交换链。
设备有四种类型,HAL(硬件抽象层)设备(支持硬件加速)、参考设备(模拟不可用的新功能)、软件设备(执行软件渲染)、空设备。
每个设备都有一个交换链,交换链由一个或多个后台缓冲区组成,渲染发生在后台缓冲区中。
资源有四个属性,资源类型(表面网格、立方体纹理、索引缓冲、顶点缓冲等)、池(内存管理与存储位置)、格式(资源在内存中的布局)、用法(用标志位方式确定如何使用资源)。
- 1996年6月,第一版Direct3D 2.0跟随DirectX 2.0发布,有”Retained mode”和”Immediate mode”。
- 1998年8月,Direct3D 6.0发布,增加了许多新特性,如Multitexture、模板缓冲区等。
- 1999年9月,Direct3D 7.0支持了T&L硬件加速。
- 2000年11月,Direct3D 8.0发布,引进了可编程管道概念,新增了顶点/片段着色器,这个时候Direct3D完全超越了OpenGL。
- 2002年12月,Direct3D 9.0发布,发布了Shader Model 2.0。支持浮点纹理格式、MRT(Multiple render targets),9.0是最后一个支持WindowsXP的版本。
- 2006年11月,Direct3D 10.0发布,仅支持Windows Vista以上操作系统。固定功能管线被淘汰,取而代之的是可编程渲染管线。新增了几何着色器阶段,发布了Shader Model 4.0。
- 2009年7月,Direct3D 11.0与Windows7一块被发布,Direct3D 11.0新增了曲面细分着色器和Computer Shader,支持了多线程处理技术,发布了Shader Model 5.0。
- 2015年1月,Direct3D 12.0包含在Windows10一块被发布,更好支持多核心、多线程的优化,降低GPU处理瓶颈,并提升硬件功耗表现。简化了Direct3D 11中的管道状态对象(Pipeline state objects)。
- 2018年10月,发布了Direct3D 12光线追踪DirectX Raytracing (DXR)的扩展包。
Metal历史
Metal是一款Low Level、Low Overhead的3D图形API,由苹果公司开发,并在2014年6月随iOS8公开。相比于OpenGL,Metal对底层拥有更大的操控性,同时又有着多线程上大量的优化。Metal Shader使用的是Metal Shader Language(MSL),是一种基于C++ 14的语言。
- 2014 年 6 月,Metal发布。在由 Apple A7 或更高版本驱动的 iOS 设备上可用,并自 2015 年 6 月 8 日起在运行 OS X El Capitan 的 Mac(2012 型号或更高版本)上可用。
- 2017 年 6 月,Metal第二个版本发布,Metal 2 可以在 Xcode 中实现更高效的分析和调试、加速机器学习、降低 CPU 工作负载、支持 macOS 上的虚拟现实,以及 Apple A11 GPU 的特性。
- 2020 年,Apple 宣布将 Mac 迁移到 Apple 芯片,使用 Apple 芯片的 Mac 将配备 Apple GPU,其功能集结合了以前在 macOS 和 iOS 上可用的功能,并将能够利用为 Apple GPU 的基于图块的延迟渲染 (TBDR) 架构量身定制的功能。
图形软件发展史
20世纪80年代,出现了许多著名的新型商业软件产品,例如Autodesk公司的AutoCAD专注于平面设计,以及它的另一个作品3D Studio专注于3D模型设计,Alias Research公司开发的Alias专注于3D模型设计。Softimage公司开发的Softimage 3D专注于集成建模、动画、渲染并成为业内标准的动画解决方案,副作用软件公司开发的Side Effects软件将程序化建模和运动产品开发成高度紧密集成的2D / 3D动画软件,并融合了多项技术突破。
到了20世纪90年代,随着硬件技术的提升,图形软件技术也开始蓬勃发展,产生一批顶级的3D图形软件,例如CAD、3MAX、MAYA、SOFTIMAGE、HOUDINI等。借助这些软件,可以大大降低制作模型和动画的成本。
因此90年开始,图形技术发展进入了重大的改革,不仅在技术上大举突破了各类瓶颈,在图形软件上有了大的进化,而且计算机图形技术开始渗透影视、动画、游戏等各行各业。
图形技术发展史
群体动物移动行为,群体行为的数学模型首先由Craig Reynolds于1986年在计算机上模拟,并很快在3D动画开始大规模使用。
动作捕捉,80年代就开始基于计算机的动作捕作为摄影测量分析工具,表演者佩戴标记每个关节附近的标记之间的位置或角度来识别运动。
运动跟踪,90年代中期,匹配移动(也称为运动跟踪或摄像头跟踪)虽然与动作捕捉有关,但却是一种完全不同的技术。除了使用特殊的相机和传感器来记录主体的运动外,还会将移动作品与预先存在的实时镜头相匹配,并单独使用计算机软件通过多个框架跟踪场景中的特定点,从而允许插入CGI元素以相对于现有材料的正确位置、比例、方向和运动进入镜头。
虚拟演播室,虚拟演播室是一个工作室,这种虚拟场景在90年代电视节目中很普遍,它可以以无缝方式,实时组合人或其他真实物体,包括计算机生成的环境和物体。它要求3D CGI环境自动锁定,进而精确跟踪角色在实时相机和镜头前的任何移动。这种系统的精髓在于它使用某种形式的相机来跟踪创建一个实时的数据流,同时会使用CGI渲染软件,软件使用相机跟踪数据并生成完美拼接的虚拟合成图像。
法线贴图,1996年,Krishnamurty和Levoy发明了法线贴图,这是对Jim Blinn 凹凸贴图的改进。
PBR&卡通材质,这两个技术都是围绕画风的,PBR 指的是”Physically Based Rendering”, 简化了物理材质的计算流程,用接近物理正确的效果来渲染材质表面,材质包括绝缘体和金属材质两种。卡通渲染(英语:Toon Shading)是一种非真实感绘制(NPR),卡通渲染又称赛璐珞渲染(Cel-shading),旨在使电脑生成的图像呈现出手绘般的效果。为了使图像可以与漫画或者卡通达到形似的效果,专业人员通常使用卡通渲染着色器进行处理。
高动态光照(HDRR,High-Dynamic Range rendering),人在黑暗的地方,为了看清楚对象,瞳孔会放大,以吸收更多光线;当突然走到光亮的地方,瞳孔来不及收缩,所以眯起眼睛,保护视网膜上的视神经。而电脑无法判断光线明暗,唯有靠HDRR技术模拟这效果——人眼自动适应光线变化的能力。方法是快速将光线渲染得非常光亮,然后将亮度逐渐降低。HDRR的最终效果是亮处的效果是鲜亮,而黑暗处的效果是能分辨物体的轮廓和深度,而不是以往的一团黑。
体积光,可以让用户看到光束效果,例如在一个画面中用户能看到太阳光束射入敞开的窗户,这就是典型的体体积光技术体现。
early-z-test,发生在顶点着色器后像素着色器之前的深度测试,原本深度测试在填充率、光照、纹理或像素着色器成为主要瓶颈的情况下已经成为了一个很好的优化,early-z-test这种技术将深度测试更进一步,提前到顶点着色器之后去完成,它节省了片元着色器的计算,但前提是片元着色器中不会有alpha混合和discard操作。
光线追踪(Ray Tracing),是三维计算机图形学中的特殊渲染算法,追踪光线从来源开始照射到物体上,再由物体反射的光线“路径”,由于完整运算所有路径十分消耗运算资源,因此现有光线追踪技术仅运算“目所能及”的光线路径,由于是从玩家视角开始进行运算,有时被误解为光线追踪是追踪“从眼睛发出的光线”。通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求高质量的效果时经常使用这种方法。 在物理学中,光线追迹可以用来计算光束在介质中传播的情况。在介质中传播时,光束可能会被介质吸收,改变传播方向或者射出介质表面等。我们通过计算理想化的窄光束(光线)通过介质中的情形来解决这种复杂的情况。 在实际应用中,可以将各种电磁波或者微小粒子看成理想化的窄波束(即光线),基于这种假设,人们利用光线追迹来计算光线在介质中传播的情况。光线追迹方法首先计算一条光线在被介质吸收,或者改变方向前,光线在介质中传播的距离,方向以及到达的新位置,然后从这个新的位置产生出一条新的光线,使用同样的处理方法,最终计算出一个完整的光线在介质中传播的路径。
其他等等渲染技术非常多,这里点到为止不再延伸开来。
游戏制作团队
这里简单介绍下游戏制作团队,虽然大多数人都知道这些知识,但不妨碍我们回顾与总结。
艺术家: 概念艺术家、三维建模师、纹理艺术家、灯光师、动画师、动捕演员、音效师、配音演员、作曲家等
产品设计: 游戏设计师、数值设计师、关卡设计师、系统设计师、AI设计师、剧情设计师、操作设计师、技能设计师、制作人等
软件工程师: 引擎工程师、渲染工程师、游戏系统工程师、AI工程师、网络工程师、构建工程师、工具开发工程师、架构工程师、效能工程师、中间件工程师、安全工程师、测试工程师等
运行时引擎架构概述
游戏引擎通常由工具套件和运行时组件两部分构成。这里我们主要来说说运行时组件部分。
与所有软件系统一样,游戏引擎也是由软件层构建的,即我们通常说的,上层依赖下层,下层不依赖上层,每层中各模块之间不相互依赖,这样的低耦合、高重用度架构在大型软件系统架构中是非常关键的设计。
《游戏引擎架构》一书中对整体架构做了介绍,但我认为内容过于粗浅,也有点过时了,于是我自己重新画了架构图。
我把整个运行时引擎架构分为十三个层级,每个层级都是只依赖下层,这十三个层级分别为:
- 目标硬件层
- 设备驱动层
- 操作系统层
- 平台独立层
- 第三方中间件
- 核心库
- 资产管理层
- 底层渲染器
- 引擎核心层
- 引擎应用层
- 业务基础层
- 游戏框架层
- 游戏业务层
下面来简单解释一下每个层级的拆解理念:
目标硬件层,代表用来执行游戏的主机硬件。
设备驱动层,是操作系统或硬件商提供的最低阶软件组件。负责管理硬件资源、也隔离了操作系统及上层引擎。
操作系统层,管理协调整台计算机上多个程序的执行工作,进程通过调用操作系统的接口来访问操作系统。
平台独立层,包装了常用的库和操作系统接口,供所有平台使用。
第三方中间件,提供了独立的解决方案,简化开发流程,缩短开发时间。包括标准库、图形接口等。
核心库,是由许许多多独立的软件工具库组成。这些库常常被引擎上层频繁使用,同时也是非常实用的软件工具。
资产管理层,提供资源增删改查的完整解决方案,通常会提供一组统一的接口,供引擎和业务去访问任意的游戏资源。
底层渲染器,提供最原始的渲染功能,根据应用层的数据调用图形API进行渲染。它通常会经过封装,从业务渲染提交的过程中拆解出来。
引擎核心层,为应用层提供了最核心的功能,包括音频、动画、物理、剔除与合批、手柄设备接口等。
引擎应用层,在核心层之上建立起来的引擎业务,包括性能剖析工具、UI核心框架、粒子系统、后处理系统等。
业务基础层,引擎为游戏框架搭建而做的基础功能,是提供给实现游戏逻辑的重要功能与接口。
游戏框架层,通过调用业务基础层来搭建的游戏框架,是游戏实现自身逻辑的框架,也是游戏逻辑的核心。
游戏业务层,是实现具体游戏业务的逻辑,通过调用游戏框架来实现具体的业务逻辑。
游戏引擎架构图
在拆解了整个引擎的架构时,由于模块太多,因此只列了一些主要的模块,保持了基本架构的完整性:
架构图中的重要模块,将在后面的文章中做详细的分析和解剖。
参考资料:
《游戏引擎架构》 译者:叶劲峰
《3D游戏引擎发展史》
https://www.bilibili.com/read/cv6499569/
《游戏引擎wiki》
https://zh.wikipedia.org/wiki/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E
《你不能不知道的计算机图形技术发展史》1、2
https://www.bilibili.com/read/cv196689
https://www.bilibili.com/read/cv221830
《了解图形接口》
https://www.jianshu.com/p/9dea5f163837
《图形API发展历史》
https://blog.csdn.net/ce1061183126/article/details/106159169
《卡通渲染 Wiki》
https://zh.wikipedia.org/wiki/%E5%8D%A1%E9%80%9A%E6%B8%B2%E6%9F%93
《高动态光照渲染》
https://zh.wikipedia.org/wiki/%E9%AB%98%E5%8A%A8%E6%80%81%E5%85%89%E7%85%A7%E6%B8%B2%E6%9F%93
《Metal Wiki》
https://en.wikipedia.org/wiki/Metal_(API)#History
《Direct3D Wiki》
https://en.wikipedia.org/wiki/Direct3D#Direct3D_12
《OpenGL Wiki》
https://en.wikipedia.org/wiki/OpenGL
《Vulkan Wiki》
https://en.wikipedia.org/wiki/Vulkan_(API)
感谢您的耐心阅读
Thanks for your reading
版权申明
本文为博主原创文章,未经允许不得转载:
Copyright attention
Please don't reprint without authorize.
微信公众号,文章同步推送,致力于分享一个资深程序员在北上广深拼搏中对世界的理解
QQ交流群: 777859752 (高级程序书友会)