背景介绍

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. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

  2. java opengl_java基于OpenGL ES实现渲染实例

    这篇文章主要介绍了java基于OpenGL ES实现渲染,实例分析了OpenGL渲染操作的相关技巧,需要的朋友可以参考下 本文实例讲述了java基于OpenGL ES实现渲染的方法.分享给大家供大家参 ...

  3. android 视频播放滤镜,用openGL ES+MediaPlayer 渲染播放视频+滤镜效果

    之前曾经写过用SurfaceView,TextureView+MediaPlayer 播放视频,和 ffmpeg avi解码后SurfaceView播放视频,今天再给大家来一篇openGL ES+Me ...

  4. android 特效相机实现,安卓特效相机(三) OpenGL ES 特效渲染

    系列文章: 特效的实现原理 接下来这篇文章我们讲下特效的具体实现原理. 由于预览画面的渲染是将Surface传给CameraDevice由它去绘制的,而且我没有找到什么可以接管或者添加渲染效果的接口, ...

  5. android OpenGL ES实现渲染到透明的纹理 render to transparent texture

    PC上OpenGL渲染到纹理,很容易得到透明背景,但是在android上OpenGL ES渲染出来是黑色背景,对于这个问题,想了两个解决办法. 1> 让android的OpenGL ES环境支持 ...

  6. 基于Surface的视频编解码与OpenGL ES渲染

    http://blog.csdn.net/gh_home/article/details/52399959 1. 概述 这篇文章所做的事情是这样的:  1. 从一个.mp4文件中解码视频流到surfa ...

  7. 苹果新Metal API实测:四倍完爆OpenGL ES

    这几年,图形API领域十分热闹.首先是AMD Mantle,虽仅支持自家GCN架构显卡,但开创了访问硬件底层.提高执行效率的先河.微软DirectX 12与其有异曲同工之妙,而且兼容所有厂商硬件,走得 ...

  8. OpenGL ES 高级进阶:EGL及GL线程

    大家好,这是我的OpenGL ES 高级进阶系列文章,在我的github上有一个与本系列文章对应的项目,欢迎关注,链接:github.com/kenneycode/- 今天给大家介绍EGL和GL线程, ...

  9. Android OpenGL ES 从入门到精通系统性学习教程

    1 为什么要写这个教程 目前这个 OpenGL ES 极简教程的更新暂时告一段落,在此之前,很荣幸获得了阮一峰老师的推荐. 因为在工作中频繁使用 OpenGL ES 做一些特效.滤镜之类的效果,加上平 ...

  10. android平台下OpenGL ES 3.0使用GLSurfaceView对相机Camera预览实时处理

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

最新文章

  1. JAVA秒杀mysql层实现_Java高并发秒杀API之web层
  2. Java并发之同步的产生及解决
  3. maven依赖错误排查经验
  4. centos7安装python-pip
  5. pageadmin CMS网站建设教程:站点添加自定义字段
  6. 第六次作业—例行报告
  7. 工业互联网二级节点建设_建设者还是二传手?
  8. java将数字替换为空_将数字替换为java中正确位置的单词
  9. Puppet安装部署篇(一)
  10. lighttpd安装_如何在Ubuntu服务器上安装Lighttpd
  11. Spring4学习笔记-泛型依赖注入
  12. 应用机器学习(七):随机森林
  13. 算法:258. Add Digits 各位相加
  14. android视频播放器卡顿,Android,_ExoPlayer循环播放本地视频,偶尔出现视频卡顿。,Android - phpStudy...
  15. 【读书笔记】Flickr 网站用户标签的质量控制对策
  16. csv文件中文乱码转换
  17. Resharper快捷键
  18. 尼康d850相机参数测试软件,尼康D850相机快门计数软件
  19. BLAM源码解析(一)—— 模块初始化
  20. java 解码_java编码与解码

热门文章

  1. CSS:布局——伸缩布局flex
  2. 三个点在同一个半圆的概率_圆中四鸭属于一个半圆的概率
  3. python语言基础实验一_实验1 Python语言基础
  4. 深度学习_pytorch_深度学习中的tensor介绍及常用操作
  5. Ubuntu开机慢_开机计时1分30秒_A start job is running for dev-disk-by...
  6. 大数据笔记_Hadoop基础知识
  7. android:获取网络时间、文件路径,修改包名,发布release版本
  8. NDCG、AUC介绍
  9. leetcode之有效的括号
  10. Struts2(三)