还在使用OpenGL ES做渲染,你Out了,赶紧来拥抱Vulkan吧~
背景介绍
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吧~的更多相关文章
- 详解 OpenGL ES 2.x 渲染流程
khronos官方对OpenGL ES的描述如下: OpenGL ES is a royalty-free, cross-platform API for rendering advanced 2D ...
- OpenGL ES之GLFW窗口搭建
概述 本章节主要总结如何使用GLFW来创建Opengl窗口.主要包括如下内容: OpenGl窗口创建介绍 GLFW Window版编译介绍 GLFW简单工程源码介绍 OpenGL窗口创建介绍 能用于O ...
- OpenGL ES应用开发实践指南:iOS卷
<OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...
- OpenGL ES 光照模型之——环境光照(RenderMonkey测试)
概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...
- OpenGL ES 学习笔记 - Overview - 小旋的博客
移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解. OverView OpenGL ...
- Android OpenGL ES 开发
OpenGL(Open Graphics Library) 是开放图形库,是一个跨平台的图形 API.OpenGL ES(OpenGL for Embedded System)是专为移动端提供的一个子 ...
- [OpenGL ES 02]OpenGL ES渲染管线与着色器
[OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...
- Android OpenGL ES 开发(N): OpenGL ES 2.0 机型兼容问题整理
在使用OpenGL ES做开发的时候,发现不是所有机型对OpenGL的代码都兼容的那么好,同样的代码在某些机型上总是会出现问题,但是在其他手机上就是好的.下面是本人总结的OpengGL 兼容问题: 一 ...
- OpenGL ES: (2) OpenGL ES 与 EGL、GLSL的关系
OpenGL ES 是负责 GPU 工作的,目的是通过 GPU 计算,得到一张图片,这张图片在内存中其实就是一块 buffer,存储有每个点的颜色信息等.而这张图片最终是要显示到屏幕上,所以还需要具体 ...
随机推荐
- MySQL 8.0 技术详解
MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上 ...
- pytorch adam 源码 关于优化函数的调整 optimizer 调参 重点
关于优化函数的调整拆下包:https://ptorch.com/docs/1/optim class torch.optim.Optimizer(params, defaults)所有优化的基类. 参 ...
- C#循环语句练习(三)
for循环拥有两类:一.穷举:把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. (1).羽毛球拍15元,球3元,水2元.200元每种至少一个,有多少可能. (2).百鸡百钱:公鸡2文钱一 ...
- C#循环语句练习(二)
1.求1!+2!+...+n! 所有阶乘的和 2.求100以内的质数 (1)第一种做法 (2)另一种做法 3. 总数=幼兔+小兔+成兔成兔=上个月的小兔+上个月的成兔小兔=上个月的幼兔幼兔=这个月的成 ...
- Python--day71--Cookie和Session
一.Cookie Cookie图示: 二.Session 引用:http://www.cnblogs.com/liwenzhou/p/8343243.html cookie Cookie的由来 大家都 ...
- codeforces 615A
题意:给你m个编号为1到m的灯泡:然后n行中每一行的第一个数给出打开灯泡的个数xi 然后是yij是每个灯泡的编号: 题目中有一句话. 我愣是没看,因为我英语真的是一窍不通,看了也白看,直接看数据做的, ...
- tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?
当我们训练自己的神经网络的时候,无一例外的就是都会加上一句 sess.run(tf.global_variables_initializer()) ,这行代码的官方解释是 初始化模型的参数.那么,它到 ...
- 试用ZooKeeper
ZooKeeper下载 通过ZooKeeper官网下载最新的稳定版本 解压ZooKeeper到某个目录,其目录结构为: 运行环境要求 系统环境 ZooKeeper对于市面上各种操作系统都有了不错的支持 ...
- H3C RIP路由表的初始化
- 递归实现深拷贝( 只要学过js递归,看不懂找我包会 )
要用递归实现深拷贝,首先说说什么是深拷贝和浅拷贝 浅拷贝:一个值赋给另一个值,当原先的值不改变地址的情况下改变数据,另一个值跟着变 深拷贝:一个值赋给另一个值,当原先的值不改变地址的情况下改变数据,另 ...