AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

次世代图形接口Vulkan对行业的影响-OpenGL的问题与缺陷 by 张静@NVIDIA

发布者 firmware
发布于 1473726650754  浏览 6493 关键词 固件Firmware, 可视化 
分享到

第1页

次世代图形接口 Vulkan 对行业 的影响

张静 GPU 架构师 @ NVIDIA



第2页

README



第3页

@ NVIDIA 上海 负责硬件部门的 OpenGL / Vulkan 性能分析工具

游戏行业经验 2K Games Ubisoft 微软 Xbox 部门

译者 OpenCV 2 计算机视觉编程手册 Processing 语言权威指南

联系方式 https://github.com/vinjn https://www.zhihu.com/people/vinjn vinjn.z@gmail.com 知乎专栏 / 微信订阅号:黑客与画家



第4页

三个问题

Vulkan 是什么? Khronos 为什么重新造轮子? 什么项目需要用 Vulkan?



第6页

Vulkan - 德语中的火山 - 不是福尔康



第7页

Vulkan 是为今后 20 年准备的图形接口

是 OpenGL / ES 的替代者 现代、高效的设计 开放的工业标准 跨平台(除了苹果系统……)



第8页

成立的背景

2012 年,Khronos 成立项目组重新设计 OpenGL,不了了之 2014 年,项目提升至最高优先级,重启为 GL Next 2015 年 GDC,首次对外公开项目细节 2016 年 GDC,发布 1.0

得到硬件厂商支持 得到游戏厂商支持 得到工具厂商支持



第9页

新面孔:Google, Nintendo, PIXAR, Oculus VR, Valve, EA, Blizzard



第10页

The Talos Principle



第11页

Dota2



第12页

Doom



第13页

OGL 出了什么问 题?



第14页

问题 一:OpenGL 编程模型与 GPU 硬件不 一致



第15页

OpenGL 被发明于 25 年前,用于昂贵的图形工作站中。



第16页

近年来移动 GPU 的兴起,多核 CPU 也成为常态,而 OpenGL 还是 没变。



第17页

GPU 甚至被用于图形以外的领域,无人机、计算机视觉、汽车、深 度学习等,OpenGL 无能为力。



第18页

解决方法:Vulkan 使用接近硬件的编程模型



第20页

问题 二:驱动工作量过大,行为难以预测



第21页

原因在于

OpenGL 开发者 在任意时间提供重要信息 在任意时间改变这些信息 对 GPU 不友好

OpenGL 驱动 会延迟工作,将工作转移给另一个线程 甚至基于猜测,无视开发者的命令 为了满足灵活性,增加大量的状态检验 跟踪资源之间的依赖



第22页

解决方法

开发者通过 Vulkan 实现对硬件的直接控制 在合适的时间 告诉驱动打算做什么 提供足够的细节

Vulkan 驱动会 在你让它工作时 做该做的事情 不做猜测,猜测 = 浪费



第24页

举例:OpenGL 的状态机被 PSO 取代



第25页

OpenGL 中的状态改变是全局的,在 Vulkan 中被 Pipeline State Object(PSO)替代

强迫你提前准备渲染的状态 你的工作量上去了 驱动的工作量降低了,更好优化、更快 OpenGL

// 可随时随地修改渲染状态

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE/GL_FILL);

Vulkan

// 预先创建两个 PSO 对象

vkCreateGraphicsPipelines(...&pipelineCreateInfo, ..., &pipelines.solid); rasterizationState.polygonMode = VK_POLYGON_MODE_LINE;

之后方可通过 来设置渲染状态vkCreateGraphicsPipelines(...&pipelineCreateInfo, ..., &pipelines.wireFrame);

// PSO vkBeginCommandBuffer(); vkCmdBindPipeline(...&pipelines.active...); vkEndCommandBuffer();



第26页

问题 三: OpenGL 对多线程不友好

需要创建 GL Context Context 需要和线程绑定 无法高效利用多核 CPU



第29页

解决方法:Queue, Command Buffer

所有对象对任何线程都可见,没有 Thread-local storage(TLS) 比如:Command Buffer 的录制可以在任意线程进行,不需要绑定 Context

多线程的对象同步成为开发者的职责 三种 Queue

General,默认 Compute,异步 计算 DMA, 异步 copy



第31页

Vulkan 对特定应用的优化

支持 Compute Shader,可以进行计算机视觉运算 支持异步计算 (Async Compute),充分榨干 GPU 性能 Android N 引入 Daydream 和 Vulkan,标志着 Vulkan 将应用在 安卓 VR 中



第32页

省电,CPU 端工作量减少

驱动工作量减少 减少错误检查 -> 不做任何错误检查 减少资源跟踪 -> 开发者的职责 驱动得到极度优化

多线程,充分利用 CPU 时间



第33页

稳定的帧率、可预测的性能,确保流畅的 VR 体验

多线程的引入使得同屏 drawcall 更多 复用 command buffer 驱动不会猜测你的行为



第34页

是否需要用 Vulkan?



第35页

挑战

复杂的编程方式 容易伤到自己 需要重新学习知识



第36页

并不是所有 OpenGL 应用都需要转成 Vulkan!



第37页

机遇

通过让开发者做更多工作,让硬件做更多工作 可以通过多线程进一步降低 可预测的性能 对移动端友好 可以参与到开放的社区中



第39页

现实

生态圈还不如 OpenGL 成熟 短时间内依然需要发布 GL / DX 版本 行业趋势

Apple - Metal Android - Vulkan Windows - DirectX 12 传统应用 - OpenGL



第40页

Vulkan vs OpenGL / ES



第41页

Vulkan vs DirectX12 vs Metal



第42页

Thanks



第43页

微信公众号“黑客与画家” 关注游戏开发、计算机视觉、图形学、虚拟现实等。

https://github.com/vinjn/slides



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。