1. Khronos工业组织标准介绍
Khronos Group团队成立于2000年1月,由包括3Dlabs, ATI, Discreet, Evans & Sutherland, Intel, NVIDIA, SGI 和 Sun Microsystems 在内的多家国际知名多媒体行业领导者创立,致力于发展开放标准的应用程序接口API,以实现在多种平台和终端设备上的媒体创作、加速和回放。
目前该组织包括了所有国际知名的游戏引擎厂商,GPU厂商,PC厂商和移动芯片厂商等等。在3D图形领域,Khronos负责OpenGL,OpenGL ES,WebGL,OpenCL,以及新一代接口Vulkan等图形编程接口标准的制定。
目前尚未正式发布的 Vulkan 是开放标准组织Khronos进军底层图形 API 领域的重要标志。这项API是轻量级、更贴近底层硬件(close-to-the-metal)的接口,可使GPU驱动软件运用多核与多线程CPU性能。这也是第一次能让专业程序设计人员充分发挥TBR(tile based rendering)的优势,TBR是移动平台最主要的GPU渲染架构。Vulkan能为高级图形带来新的性能与效率水平,并能与广泛部署的OpenGL ES API并存。OpenGL ES API仍将是偏好较高层级接口的程序设计人员的常见选择。
Khronos Group 总裁Neil Trevett表示:“今天,OpenGL和OpenGL ES已在数十亿颗 GPU上得到应用, Khronos将持续演进并维护这些广受欢迎的3D API。而新的图形接口Vulkan将能在新型的GPU上提供图形与运算功能的高效率读取,使应用程序能直接控制GPU加速,以取得最佳的性能与可预测性。我们很高兴开发人员将能在Android设备上使用Vulkan。 ”
Vulkan是被设计出来运行在各种操作系统平台和GPU的图形接口,这点与微软的DirectX和苹果的Metal标准是不同的。微软的DirectX只需要运行在windows平台,而苹果的Metal也只需要运行在自己的平台上面。
3. Vulkan特点
3.1. Vulkan跨平台特性
Vulkan支持的操作系统包括:Linux, Windows XP to Windows 10, android等。Vulkan还可以支持主流的GPU,包括:AMD, NVIDIA, Adreno, PowerVR, Mali等桌面GPU和移动GPU。
3.2. OpenGL/OpenGL ES与Vulkan比较
如下图,OpenGL驱动是一个庞大的接口层,应用不是直接的访问GPU的资源,而必须要按照OpenGL接口的方法去访问这带来了如下问题:
复杂的驱动导致过度的CPU开销,以及设备运行的不可预测性。这意味着应用不能预测某个接口调用开销,也就无法优化代码的运行。
驱动总是开启错误检测,增加了额外的CPU开销。事实上如果应用自己做了错误检查,那么驱动就没必要再做一遍。
驱动需要编译链接整个shader代码,这在应用启动时会占用更多的初始化时间。
桌面系统和移动系统使用不一样的API接口,OpenGL ES被广泛应用于移动设备中,但是在桌面系统上面还是使用OpenGL,这使得应用没法方便的跨平台开发。
Vulkan提出的目的之一就是避免上述OpenGL驱动存在的缺点,。Vulkan的特性如下:
更加简单的驱动结构,使得开销更小和更好的设备一致性。
提供分层架构,使得驱动执行时的正确性验证和调试信息可以按需加载。在良好验证的应用情况下,我们可以节省掉错误检测和调试代码执行的开销。
Vulkan运行时不需要处理整个shader代码,而是处理SPIR-V中间代码。这可以节省shader编译链接的时间。
为移动平台,桌面系统以及嵌入式设备提供统一的API。
Vulkan不负责内存的管理,多线程的管理和并发访问保护,把这些工作转移给应用程序去负责,而Vulkan只需要专注于提供GPU的功能给应用。
3.3. Vulkan使用场景
Vulkan作为一个紧贴硬件底层的驱动程序,对于应用来说可以提供多种使用场景。
应用程序直接调用Vulkan接口来访问GPU实现图形渲染和通用计算,在这种场景下面应用可以获得最大的灵活性和对GPU的控制权,但是其难度也是最高的。
第二种应用场景是应用程序通过工具库来调用Vulkan,而不是直接使用Vulkan接口。工具库对Vulkan接口做一个包装,使得应用程序更易于使用。这种工具库的一种实现方式就是直接把Vulkan包装成OpenGL或者OpenGL ES接口。例如Imagination就计划提供这样的工具库,使得利用OpenGL ES的老应用程序也能顺利得在Vulkan接口上面运行,而不需要更改任何代码。
第三种应用场景就是应用程序直接调用游戏引擎。因为应用程序不需要考虑如何用Vulkan实现,所以应用程序的实现比较简单。而专业的游戏引擎厂商负责优化对Vulkan的调用,使得应用可以获得Vulkan带来的性能提升。
Vulkan作为一个直接提供GPU硬件功能的接口而不在负责多线程渲染的调度以及线程并发访问的安全保护等工作,这意味着Vulkan接口内部不再像OpenGL ES一样有过度的线程同步,CPU/GPU同步等操作。这些操作会为接口的运行效率带来不可预测的影响。如上图所示,每个独立的线程都可以并行地生成渲染的command buffer,这些command buffer最后会被提交给一个统一的command queue,GPU会按照command buffer提交的顺序来执行。任何需要跨线程访问的资源,都需要应用自己保证访问的一致性。
3.5. Vulkan的shading language环境
Vulkan不再使用GLSL作为shading language的输入,而是使用一个统一的中间代码(SPIR)作为输入。OpenGL/OpenGL ES或者游戏引擎使用的GLSL都会被一个SPIR-V解释器翻译成SPIR表示。未来其它的shading language或者通用计算的语言也会被翻译成SPIR作为Vulkan的输入。这可以使Vulkan驱动专注于shader的后端优化,而不是前端的语法解析,语义分析等。对于GLSL转SPIR,Khronos正在考虑实现一个编译器前端来帮助应用程序转换。
Vulkan提供灵活的架构可以使应用按照需求来启用驱动的错误检测和调试信息。如果应用是一个验证良好的程序,那么应用就直接使用Vulkan接口来访问GPU,不做任何的错误检测和调试,这可以节约大量的CPU开销,提升应用的性能。反之,应用可以通过Vulkan提供的Debug Layer和Validation Layer来实现错误检测和调试信息的输出。这使得应用在开发调试时可以获得大量的有用信息。一旦应用发布又可以去除掉这些CPU开销,使得性能提升。