当前位置:网站首页>Vulkan-性能及精细化
Vulkan-性能及精细化
2022-07-02 23:37:00 【很久没安静的回忆了】
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谷歌的新一代跨平台系统也支持。
边栏推荐
猜你喜欢
Linux Software: how to install redis service
Solution to the problem of abnormal display of PDF exported Chinese documents of confluence
[shutter] Introduction to the official example of shutter Gallery (project introduction | engineering construction)
MySQL 23 classic interview hanging interviewer
Shell 实现文件基本操作(sed-编辑、awk-匹配)
Rust所有权(非常重要)
[target detection] r-cnn, fast r-cnn, fast r-cnn learning
MySQL 23道经典面试吊打面试官
Feature Engineering: summary of common feature transformation methods
Markdown tutorial
随机推荐
What are the recommended thesis translation software?
NC24840 [USACO 2009 Mar S]Look Up
Bypass AV with golang
Automated defect analysis in electronic microscopic images
MySQL 23 classic interview hanging interviewer
多进程编程(四):共享内存
Where can I find the English literature of the thesis (except HowNet)?
The "2022 China Digital Office Market Research Report" can be downloaded to explain the 176.8 billion yuan market in detail
Markdown使用教程
Feature Engineering: summary of common feature transformation methods
Basic 10 of C language: array and pointer
Pat 1030 travel plan (30 points) (unfinished)
使用jenkins之二Job
Nc20806 District interval
Mutual exclusion and synchronization of threads
MySQL 23道经典面试吊打面试官
The most painful programming problem in 2021, adventure of code 2021 Day24
Should you study kubernetes?
FAQ | FAQ for building applications for large screen devices
Introduction of UART, RS232, RS485, I2C and SPI