Vulkan是新一代的图形显示API。也有业界称之为“下一代的OpenGL”,不言而喻人们也总喜欢拿Vulkan和OpenGL(已经经历了20年之久的非常成熟的当代图形API的大成者)作对比以突出其在某些场景下的优势。

Vulkan--API设计哲学

*
Explicit(明确、透明):GPU Driver做更少的事情,把更多的控制权交给开发

*
Streamlined(精简):更快的性能,更低的开销,更少的延

*
Portable(可移植):Cloud, desktop, console, mobile and embedde

*
Extensible (可扩展):支持新功能的扩展,推动行业技术进

再用一句话概括下,Vulkan是下一代高性能及精细化控制的开放的跨平台的图形API。下面我们也会围绕这句总结展开来说。

开放

Vulkan是由Khronos Group组织发布的跨平台图像渲染引擎,该组织还发布了诸如OpenGL、OpenGL
ES、WebGL等图形API。Vulkan脱胎于Mantle,其包含部分Mantle组件;Mantle是面向3D游戏的新一代图形渲染 API,
可以让开发人员直接操作GPU的底层硬件,从而提高硬件利用率和游戏性能。 但遗憾的是因为AMD行业影响力不足, Mantle并没有成为全行业的标准。

然而微软参考AMD Mantle的思路开发了DirectX 12,
苹果则提出了Metal。2015年Khronos从AMD接过Mantle并孵化出后来的Vulkan,并推动Vulkan的大力发展。Vulkan的开发者来自图形领域的各行各业,有GPU厂商,有系统厂商,有游戏引擎厂商

 

跨平台

Vulkan的开发者来自图形领域的各行各业,有GPU厂商,有系统厂商,有游戏引擎厂,所以与生俱来的属性就是跨平台,以全行业的统一标准为终极目标。其支持桌面、移动设备、游戏主机、嵌入式等等。

精细化控制

传统的图形API,驱动是个大包大揽的角色,驱动程序会跟踪对象状态,会帮你做API验证,内存管理,线程管理等大部分工作。驱动帮开发者隐藏了很多底层细节,当然这样对开发者来说是个福音,因为以开发者的视角看这样操作起来简单,不需要考虑太多底层的实现及错误处理。驱动甚至在api调用出错的时候都能帮助处理,保证应用正常运行。但是为了实现这些,驱动会浪费更多的性能,应用程序经过调试并且正确运行时,会消耗宝贵的CPU性能,在一些复杂场景和极致的性能体验场景下,这种问题会指数倍的放大而且开发者会很沮丧,因为他们能缓解这种局面的能力并不多,有时候也会非常复杂,因为驱动在不同平台和厂商下实现是不一样的。

Vulkan为了解决这个问题,提供了更显示的API,更精细化的GPU底层控制逻辑,并将驱动视为一个应用和GPU之间的桥梁,帮忙做数据通信及指令传递。Vulkan将状态跟踪、同步和内存管理交给了应用程序开发人员,甚至不包括执行期的错误检查层。一旦API使用出错,
应用就会出现crash。没人帮应用兜底,所有事情都交由应用打理。驱动层干的事情少了,隐藏的 bug 也就少了。

Vulkan让程序有更多的权限和责任自主的处理调度和优化,而不依赖于驱动尝试在后台的优化。但对于开发者其使用的复杂度也就变高了,并且在一定程度上稳定性降了。

虽然这种方式无疑增加了API使用的复杂度和困难度,但换来的是性能上巨大的提升。单单是在驱动中去掉API验证,就把性能提升了9倍。

性能

多线程

Vulkan基于Queue的API设计对多线程非常友好,同时也提供了多种Synchronization的方法。常见的并行方法有两种,第一种是在CPU端并行的更新Buffer中的数据。这里要注意的是,多线程的情况下更新资源要保证安全。第二种是并行的方式带来的性能提升更加显著,尤其是在渲染非常复杂的场景。

第一种如果你的程序渲染的非常高效,同时在CPU端需要处理好几帧的数据,所以程序可以用Round
Robin的方法更新并且使用这些资源。这个时候要保证安全的更新资源。Vulkan的Event可以被插入在Command
Buffer中,在使用指定资源的调用后面可以更高效的保正资源的安全性。

第二种并行的方式带来的性能提升更加显著,尤其是在渲染非常复杂的场景下,这也是Vulkan相比传统API提升最显著的地方,那就是并行的在不同线程上生成场景不同部分的渲染任务,并且生成自己的Command
Buffer,不用任何线程间的Synchronization。最后,不同的线程可以将Command
Buffer的Handle传给主线程然后由主线程将它们写入Queue中,也可以直接写入子线程中的per-thread
Queue递交给GPU。给开发者提供了充分发挥CPU多核多线程的优势。在复杂场景下,性能的提升非常可观!

不过Queue的任务递交时间并不是完全可以忽略的,所以这里还是建议将Command传给主线程一起递交。这样的模式达到了计算资源利用的最大化,多个CPU核都参与了场景的渲染,并且有大量的渲染任务同时递交给GPU最大化了GPU的吞吐量。

预编译shader

驱动层不提供前端 shader 编译器。仅仅支持标准可移植中间表示二进制代码(SPIR-V),可支持AOT和运行时。既提高了执行 Shaders
的效率又添加了将来着色语言的灵活性。Vulkan也可以使用离线的shader

移动平台的支持进展

Android 7.0 添加了对 Vulkan 的支持, Q 开始将使用 vulkan 进行默认的 UI 渲染。

Flutter框架的底层图形库Skia是支持Vulcan的,Fuchsia谷歌的新一代跨平台系统也支持。

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信