背景介绍

Vulkan是Khronos组织制定的“下一代”开放的图形显示API。是与DirectX12能够匹敌的GPU API标准。

Vulkan是基于AMD的Mantle API演化而来,眼下Vulkan 1.0标准已经完毕并正式公布。下图是Vulkan的效果:

上一代的OpenGL|ES并不会被遗弃。还会继续发展,非常有可能OpenGL|ES变为Vulkan的简化API。

Vulkan的优势

与OpenGL|ES相比Vulkan的优势:

1、更简单的显示驱动层

Vulkan提供了能直接控制和訪问底层GPU的显示驱动抽象层。显示驱动仅仅是对硬件薄薄的封装,这样能够显著提升操作GPU硬件的效率和性能。之前OpenGL的驱动层对开发人员隐藏的非常多细节,如今都暴露出来。Vulkan甚至不包括执行期的错误检查层。驱动层干的事情少了,隐藏的bug也就少了。

2、支持多线程

Vulkan不再使用OpenGL的状态机设计,内部也不保存全局状态变量。显示资源全然由应用层负责管理。包括内存管理、线程管理、多线程绘制命令产生、渲染队列提交等。

应用程序能够充分利用CPU的多核多线程的计算资源,降低CPU等待,降低延迟。带来的问题是。线程间的同步问题也由应用程序负责,从而对开发人员的要求也更高。

3、预编译Shaders

驱动层不提供前端shader编译器。仅仅支持标准可移植中间表示二进制代码(SPIR-V)。

即提高了执行Shaders的效率又添加了将来着色语言的灵活性。

所以眼下的GLSL/HLSL能够直接通过工具转换为SPIR-V。在Vulkan中使用。这样就能够使用离线的shader编译。

另外。SPIR-V还支持OpenCL!

4、跨平台

支持桌面、移动设备、游戏主机、嵌入式……仅仅要须要显示的地方,貌似都能支持。

这也是Vulkan与DirectX12相比的优势。

Vulkan与多线程

OpenGL|ES不支持多线程一直被广为诟病。Vulkan开始设计之处就考虑多线程问题,能够说就是为了多线程而设计的。命令缓冲和和命令调度队列是Vulkan支撑多线程的重要组成部分。相似OpenGL的上下文状态。

Vulkan的命令缓冲都是独立的互不干扰的单元。支持在多个线程中创建。这样就能够由多个线程创建不同的绘制命令。由单独的线程管理渲染命令队列,统一提交给GPU绘制,例如以下图所看到的:

Vulkan窗体系统集成

Vulkan把显示设备的创建和窗体系统的创建明白分开。

显示设备仅仅提供支持可视化的显示队列的接口,应用程序控制怎样显示绘制结果。比方前后显示缓冲这些的都由应用程序创建和设置。

Vulkan提供标准的扩展API支持多窗体系统。如Android、Windows、X等窗体系统。

Android平台上的Vulkan演进

Android 7.0 添加了对Vulkan的支持。Vulkan 是用于高性能 3D 图形的低开销、跨平台 API。与 OpenGL ES 一样,Vulkan 提供多种用于在应用中创建高质量的实时图形的工具。Vulkan 的优势包括降低 CPU 开销以及支持SPIR-V 二进制中间语言。系统芯片 (SoC) 供应商(如 GPU 独立硬件供应商 (IHV))可以编写适用于 Android 的 Vulkan 驱动程序;原始设备制造商 (OEM) 只需为特定设备集成这些驱动程序即可。要详细了解 Vulkan 驱动程序如何与系统进行交互、应如何安装特定于 GPU 的工具以及特定于 Android 的要求,请参阅实现 Vulkan。应用开发者可以利用 Vulkan 来创建在 GPU 上执行命令的应用,大幅降低开销。此外,Vulkan 还可以更直接地映射到当前图形硬件中的功能,最大限度地降低驱动程序的出错概率,并减少开发者的测试时间(例如,排查 Vulkan 错误所需的时间更短)。

Android Vulkan 组件

Vulkan 支持包含以下组件:

Vulkan 验证层(在 Android NDK 中提供)。这是开发者在开发 Vulkan 应用期间使用的一组库。图形供应商提供的 Vulkan 运行时库和 Vulkan 驱动程序不包含使 Vulkan 运行时保持高效的运行时错误检查功能,而是使用验证库(仅在开发过程中)来查找应用在使用 Vulkan API 时出现的错误。Vulkan 验证库在开发过程中关联到应用并执行此错误检查。在找出所有 API 使用问题之后,该应用将不再需要包含这些库。

Vulkan 运行时(由 Android 提供)。这是一个原生库 ((libvulkan.so),提供称为Vulkan的新公共原生 API。大多数功能由 GPU 供应商提供的驱动程序实现;运行时会封装驱动程序、提供 API 拦截功能(针对调试和其他开发者工具)以及管理驱动程序与平台依赖项(如 BufferQueue)之间的交互。Vulkan 驱动程序(由 SoC 提供)。将 Vulkan API 映射到特定于硬件的 GPU 命令以及与内核图形驱动程序的交互。已修改的组件为支持 Vulkan,Android 7.0 对以下现有图形组件进行了修改:

BufferQueue:Vulkan 运行时通过现有ANativeWindow接口与现有的 BufferQueue 组件进行交互。对ANativeWindow和 BufferQueue 进行了细微的修改(新枚举值和新方法),而架构没有任何变更。

Gralloc HAL:添加了一个新的可选接口,用于了解是否可将某种指定格式用于特定生产方/消费方组合,而无需实际分配缓冲区。

Vulkan API:Android 平台包括来自 Khronos Group 的Vulkan API 规范的Android 特定实现。Android 应用必须使用Window 系统集成 (WSI) 扩展程序来输出其呈现内容。

Fuchsia上的使用

2016年开始,Google有一群超过百人的工程师团队秘密研发一款名为Fuchsia的新系统,该团队很豪华,有来自Android、iPhone、WebOS、Chrome、Flutter等核心工程师,这么多优秀的人在一起研发这个项目,的确值得期待。Fuchsia的内核采用Zircon,UI层采用Flutter框架,底层渲染Escher,支持Vulkan作为底层Graphics API。

Google表示未来几年会大力推广Vulkan技术,Vulkan是一种跨平台的高性能低开销的图形接口,在移动设备上比OpenGL ES有着更出色的表现。Vulkan将会是未来Android平台的一个发展方向,尤其是游戏领域,比如王者荣耀Vulkan版本。

Android Q

xda大神爆料,安卓Q开始将使用vulkan进行默认的UI渲染,安卓的UI将进入纯GPU渲染的阶段,流畅度暴增一个数量级。

欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长。

还在使用OpenGL ES做渲染,你Out了,赶紧来拥抱Vulkan吧~的更多相关文章

  1. 详解 OpenGL ES 2.x 渲染流程

    khronos官方对OpenGL ES的描述如下: OpenGL ES is a royalty-free, cross-platform API for rendering advanced 2D ...

  2. OpenGL ES之GLFW窗口搭建

    概述 本章节主要总结如何使用GLFW来创建Opengl窗口.主要包括如下内容: OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于O ...

  3. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  4. OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

    概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...

  5. OpenGL ES 学习笔记 - Overview - 小旋的博客

    移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解. OverView OpenGL ...

  6. Android OpenGL ES 开发

    OpenGL(Open Graphics Library) 是开放图形库,是一个跨平台的图形 API.OpenGL ES(OpenGL for Embedded System)是专为移动端提供的一个子 ...

  7. [OpenGL ES 02]OpenGL ES渲染管线与着色器

    [OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...

  8. Android OpenGL ES 开发(N): OpenGL ES 2.0 机型兼容问题整理

    在使用OpenGL ES做开发的时候,发现不是所有机型对OpenGL的代码都兼容的那么好,同样的代码在某些机型上总是会出现问题,但是在其他手机上就是好的.下面是本人总结的OpengGL 兼容问题: 一 ...

  9. OpenGL ES: (2) OpenGL ES 与 EGL、GLSL的关系

    OpenGL ES 是负责 GPU 工作的,目的是通过 GPU 计算,得到一张图片,这张图片在内存中其实就是一块 buffer,存储有每个点的颜色信息等.而这张图片最终是要显示到屏幕上,所以还需要具体 ...

随机推荐

  1. VMware station 安装报错 failed to install the hcmon driver

    VMware station 安装报错 failed to install the hcmon driver 1.将 C:\Windows\System32\drivers 下的hcmon.sys改名 ...

  2. 洛谷P1488 肥猫的游戏 题解 博弈论入门

    题目链接:https://www.luogu.org/problem/P1488 其实这道题目我只需要 \(n\) 以及黑色三角形的三个端点编号就可以了. 我们假设在一个 \(n\) 边形中,黑色三角 ...

  3. poj 1279 Art Gallery (Half Plane Intersection)

    1279 -- Art Gallery 还是半平面交的问题,要求求出多边形中可以观察到多边形所有边的位置区域的面积.其实就是把每一条边看作有向直线然后套用半平面交.这题在输入的时候应该用多边形的有向面 ...

  4. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

  5. C# 强转会不会抛出异常

    最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常.实际上不会出现异常 最简单的代码是使用一个比 maxvalue 大的数,然后用它强转 long tathkDucmmsc = int.Max ...

  6. [C++] 检查随机内存溢出

    C++程序的随机内存溢出是非常难处理的,windows提供了一些工具来缓解这个问题. windows debuger提供的Global Flags可以设置"enable heap tail ...

  7. vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)

    [注]:  popstate 事件 a.当活动历史记录条目更改时,将触发popstate事件. b.如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对his ...

  8. linux 使用 jiffies 计数器

    这个计数器和来读取它的实用函数位于 <linux/jiffies.h>, 尽管你会常常只是包含 <linux/sched.h>, 它会自动地将 jiffies.h 拉进来. 不 ...

  9. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  10. jQuery 工具类函数-字符串操作函数

    调用名为$.trim的工具函数,能删除字符串中左右两边的空格符,但该函数不能删除字符串中间的空格,调用格式为: $.trim (str); 参数str表示需要删除左右两边空格符的字符串. <bo ...