Vulkan是一种跨平台的2D和3D图形应用程序接口,最早由Khronos组织在2015年GDC上发布。其本质上是AMD Mantle的后续版本,继承了前者强大的低开销架构,使开发人员能够方便全面地获刷GPU与多核CPU的性能、功能和提升效率。
相比于OpenGL,Vulkan支持深入硬件底层进行控制,并能大幅度降低CPU在高负载绘制任务中的开销。同时其对多核心CPU的支持也更加完善,更加适应当下从高端工作站到PC平台到移动平台的多核战略。
Vulkan因为高性能和低开销而大受欢迎,虽然面市不久,但市面上目前已有不少支持Vulkan的游戏和应用,如《Doom》《Dota2》《极品飞车—无极限》等。
1.1 Vulkan概览
介绍具体的开发技术之前,本节将首先介绍Vulkan的历史传承以及一些技术特点,同时将Vulkan与其他的图形应用程序接口(OpenGL、DirectX、Metal等)进行简要的比较,最后还会介绍一下当下支持Vulkan的游戏,具体内容如下。
1.1.1 Vulkan简介
了解Vulkan的具体知识之前,我们有必要首先了解一下市面上主流的各3D图形应用程序接口。目前各平台下主流的3D图形API有OpenGL、OpenGL ES、DirectX、Metal以及Vulkan,其各自的应用领域及特点如下。
- OpenGL的应用领域较为广泛,支持多种操作系统平台(如Windows、UNIX、Linux、macOS等)。基于其开发的应用可以方便、低成本地在不同操作系统平台之间移植。既可以用于开发游戏,又可以用于开发工业、行业应用。
- OpenGL ES是专门针对移动嵌入式平台而设计的,实际是OpenGL的剪裁版本。去除了OpenGL中许多不必要的特性,优化了对性能、供电受限的移动嵌入式平台的支持。
- DirectX为微软的专有技术,主要用于Windows下游戏的开发,在此领域占有极高的比例。最新的版本为DirectX 12,此版本也是大大优化了对多核CPU的支持,但仅支持Windows 10。
- Metal是Apple的专有技术,仅仅能够在macOS以及iOS下使用,应用的领域相对比较狭窄,目前基于它的应用相对较少。
- Vulkan与OpenGL类似,是跨平台的3D图形应用程序接口,同时支持Windows 7、Windows 8.1、Windows 10、Linux以及Android等平台。
Vulkan最早被称为下一代OpenGL,项目名称为GLNext。其设计考虑到了统一各个平台的开发,因此不像OpenGL与OpenGL ES那样,根据硬件性能、供电区分不同版本,而是工作站、PC、移动嵌入式等平台完全一致。这对广大开发人员来说,是一个极大的利好。
2016年2月16日,Khronos组织发布了Vulkan的首个正式版本。从此,数字图形技术产业诞生了一个真正意义上能与DirectX 12、Metal分庭抗礼的全新图形应用程序接口。到2016年4月,Google在第二个Android N的开发预览版中也正式加入了对Vulkan的支持。Vulkan的主要特点如下。
- Vulkan提供更低的运行开销、更直接的GPU控制和较低的CPU负载。其通过批处理方式有效减少CPU的负载,将CPU从额外的运算和渲染中解放出来去执行其他的任务。
- 相比于以往面向CPU单核心设计的OpenGL,Vulkan原生支持多线程并发处理,能够更好地与当下普遍采用多核战略的CPU协同工作。DirectX 12、Metal等厂商专有的新一代图形应用程序接口也都在多线程并发方面提供了支持,可见这是业界发展的大趋势。
- 着色器方面,Vulkan也不再像OpenGL一样指定高层的着色器编程语言(OpenGL指定采用GLSL着色器编程语言),而是采用一种被称为SPIR-V(Standard Portable Intermediate Representation)的二进制中间层格式。这样,开发人员在开发Vulkan着色器时可以选用自己青睐的着色器编程语言,诸如GLSL、HLSL等,然后将着色器源代码采用着色器专用编译器编译为SPIR-V格式即可在Vulkan中使用,大大提高了灵活性。
- Vulkan将计算任务和图形着色渲染任务统一管理,无需使用单独的计算和图形应用程序接口进行连接。
- 不同于OpenGL的状态机,在运行任务时会自动进行各种错误检查(不可关闭)。Vulkan为了追求更高的执行效率,将各种错误的检查设计为可插拔模式。开发人员可以在开发调试时打开所需的错误检查项目,在发布时关闭错误检查项目,以达到更好的性能。
- Vulkan在架构层面提供了对多轮渲染的支持,使得可以以更高的效率实现延迟渲染以在特定场景下大大提高渲染效率。
Vulkan本身博大精深,其革命性的设计远远不止上述这些,读者可以跟随本书的脚步逐渐深入地学习Vulkan的方方面面。
1.1.2 支持Vulkan的游戏概览
通过前面简单的介绍,读者已基本了解到Vulkan相比于传统图形应用程序接口的多项优势。正因为Vulkan这些突出的特性,目前市面上已有几款知名游戏开始使用Vulkan。但由于Vulkan诞生的时间不长,故使用Vulkan的游戏数量还不是很多。接下来,我们将对使用Vulkan的几款游戏进行简单的介绍。
- Dota
作为一款广受玩家欢迎的巨作,早在2016年Dota 2便推出官方补丁使其支持Vulkan。如图1-1所示为原版Dota 2的游戏场景图,图1-2所示为在Vulkan支持下运行的Dota 2游戏场景图。
▲图1-1 原版Dota 2游戏场景
▲图1-2 Vulkan支持下的Dota 2游戏场景
说明
通过对比图1-1、图1-2可以看出,在游戏画面方面,Vulkan支持下的Dota 2较原版Dota 2场景更加逼真、细腻。在游戏的实际对比测试中,可以感觉到Vulkan支持下的Dota 2运行更加流畅,并且可以观察到CPU使用率更低,这正体现了Vulkan降低CPU开销的特点。
- 极品飞车
通过对比Dota 2在使用Vulkan前后的场景画面,我们已经观察到了Vulkan在3D图形处理方面的进步。接下来将通过展示Electronic Arts开发的赛车竞技类游戏“极品飞车:无极限”,进一步感受Vulkan的3D图形处理能力,具体情况如图1-3和图1-4所示。
▲图1-3 极品飞车:无极限场景1
▲图1-4 极品飞车:无极限场景2
说明
可以看出上述两幅使用Vulkan API渲染出的“极品飞车:无极限”游戏场景画面光影效果极其逼真,烟雾、运动模糊效果都很真实。
- Dream League Soccer
介绍完上述两款支持Vulkan的游戏Dota 2和极品飞车之后,不得不介绍First Touch开发的体育类游戏——Dream League Soccer。该游戏自发布以来一直广受玩家的好评,现在更是推出了Vulkan版本,其效果分别如图1-5和图1-6所示。
▲图1-5 Dream League Soccer场景1
▲图1-6 Dream League Soccer场景2
通过对上述几款游戏画面的观察,我们可以领略到Vulkan在3D图形处理方面的能力提升。前面的内容中,多次提到Vulkan的一大优势是能够大幅度降低渲染时的CPU开销,这将直接影响游戏运行及画面的流畅度,有关权威组织对Vulkan这方面的测试也不少。
比如早在2016年Bethesda和Nvidia就进行了相关测试,测试结果表明使用DirectX 11在1080P分辨率下运行《毁灭战士4》,平均帧率在55~60之间。之后,使用Vulkan进行同样的渲染工作,整个游戏帧率提升到了震撼的120以上,可见Vulkan在降低CPU开销及图形渲染等方面均效果显著。
本书系统地介绍下一代OpenGL规范Vulkan,揭示了Vulkan的独特性。本书主要内容包括:内存和资源、队列和命令、数据的移动、图像的展示、着色器和管线、图形管线对象、绘制命令、几何体的处理、片段的处理、同步、数据的回读以及多渲染通道等。