1. Khronos工業組織标準介紹
Khronos Group團隊成立于2000年1月(yuè)(yuè),由包括3Dlabs, ATI, Discreet, Evans & Sutherland, Intel, NVIDIA, SGI 和 Sun Microsystems 在内的多家國際知名多媒體(tǐ)行業領導者創立,緻力于發展開放(fàng)标準的應用程序接口API,以實現(xiàn)在多種平台和終端設備上(shàng)的媒體(tǐ)創作(zuò)、加速和回放(fàng)。
目前該組織包括了(le)所有國際知名的遊戲引擎廠商(shāng),GPU廠商(shāng),PC廠商(shāng)和移動芯片廠商(shāng)等等。在3D圖形領域,Khronos負責OpenGL,OpenGL ES,WebGL,OpenCL,以及新(xīn)一(yī)代接口Vulkan等圖形編程接口标準的制定。
2. Vulkan
目前尚未正式發布的 Vulkan 是開放(fàng)标準組織Khronos進軍底層圖形 API 領域的重要标志。這(zhè)項API是輕量級、更貼近底層硬件(close-to-the-metal)的接口,可使GPU驅動軟件運用多核與多線程CPU性能(néng)。這(zhè)也(yě)是第一(yī)次能(néng)讓專業程序設計人(rén)員(yuán)充分(fēn)發揮TBR(tile based rendering)的優勢,TBR是移動平台最主要的GPU渲染架構。Vulkan能(néng)為(wèi)高級圖形帶來(lái)新(xīn)的性能(néng)與效率水平,并能(néng)與廣泛部署的OpenGL ES API并存。OpenGL ES API仍将是偏好(hǎo)(hǎo)較高層級接口的程序設計人(rén)員(yuán)的常見選擇。
Khronos Group 總裁Neil Trevett表示:“今天,OpenGL和OpenGL ES已在數十億顆 GPU上(shàng)得到應用, Khronos将持續演進并維護這(zhè)些(xiē)廣受歡迎的3D API。而新(xīn)的圖形接口Vulkan将能(néng)在新(xīn)型的GPU上(shàng)提供圖形與運算(suàn)功能(néng)的高效率讀取,使應用程序能(néng)直接控制GPU加速,以取得最佳的性能(néng)與可預測性。我們很高興開發人(rén)員(yuán)将能(néng)在Android設備上(shàng)使用Vulkan。 ”
Vulkan是被設計出來(lái)運行在各種操作(zuò)系統平台和GPU的圖形接口,這(zhè)點與微軟的DirectX和蘋果的Metal标準是不同的。微軟的DirectX隻需要運行在windows平台,而蘋果的Metal也(yě)隻需要運行在自己的平台上(shàng)面。
3. Vulkan特點
3.1. Vulkan跨平台特性
Vulkan支持的操作(zuò)系統包括:Linux, Windows XP to Windows 10, android等。Vulkan還可以支持主流的GPU,包括:AMD, NVIDIA, Adreno, PowerVR, Mali等桌面GPU和移動GPU。
3.2. OpenGL/OpenGL ES與Vulkan比較
如(rú)下(xià)圖,OpenGL驅動是一(yī)個(gè)龐大的接口層,應用不是直接的訪問GPU的資源,而必須要按照OpenGL接口的方法去訪問這(zhè)帶來(lái)了(le)如(rú)下(xià)問題:
複雜的驅動導緻過度的CPU開銷,以及設備運行的不可預測性。這(zhè)意味着應用不能(néng)預測某個(gè)接口調用開銷,也(yě)就(jiù)無法優化(huà)代碼的運行。
驅動總是開啓錯誤檢測,增加了(le)額外的CPU開銷。事(shì)實上(shàng)如(rú)果應用自己做了(le)錯誤檢查,那麽驅動就(jiù)沒必要再做一(yī)遍。
驅動需要編譯鏈接整個(gè)shader代碼,這(zhè)在應用啓動時(shí)會占用更多的初始化(huà)時(shí)間(jiān)。
桌面系統和移動系統使用不一(yī)樣的API接口,OpenGL ES被廣泛應用于移動設備中,但(dàn)是在桌面系統上(shàng)面還是使用OpenGL,這(zhè)使得應用沒法方便的跨平台開發。
Vulkan提出的目的之一(yī)就(jiù)是避免上(shàng)述OpenGL驅動存在的缺點,。Vulkan的特性如(rú)下(xià):
更加簡單的驅動結構,使得開銷更小和更好(hǎo)(hǎo)的設備一(yī)緻性。
提供分(fēn)層架構,使得驅動執行時(shí)的正确性驗證和調試信息可以按需加載。在良好(hǎo)(hǎo)驗證的應用情況下(xià),我們可以節省掉錯誤檢測和調試代碼執行的開銷。
Vulkan運行時(shí)不需要處理(lǐ)整個(gè)shader代碼,而是處理(lǐ)SPIR-V中間(jiān)代碼。這(zhè)可以節省shader編譯鏈接的時(shí)間(jiān)。
為(wèi)移動平台,桌面系統以及嵌入式設備提供統一(yī)的API。
Vulkan不負責内存的管理(lǐ),多線程的管理(lǐ)和并發訪問保護,把這(zhè)些(xiē)工作(zuò)轉移給應用程序去負責,而Vulkan隻需要專注于提供GPU的功能(néng)給應用。
3.3. Vulkan使用場(chǎng)景
Vulkan作(zuò)為(wèi)一(yī)個(gè)緊貼硬件底層的驅動程序,對于應用來(lái)說(shuō)可以提供多種使用場(chǎng)景。
應用程序直接調用Vulkan接口來(lái)訪問GPU實現(xiàn)圖形渲染和通用計算(suàn),在這(zhè)種場(chǎng)景下(xià)面應用可以獲得最大的靈活性和對GPU的控制權,但(dàn)是其難度也(yě)是最高的。
第二種應用場(chǎng)景是應用程序通過工具庫來(lái)調用Vulkan,而不是直接使用Vulkan接口。工具庫對Vulkan接口做一(yī)個(gè)包裝,使得應用程序更易于使用。這(zhè)種工具庫的一(yī)種實現(xiàn)方式就(jiù)是直接把Vulkan包裝成OpenGL或者OpenGL ES接口。例如(rú)Imagination就(jiù)計劃提供這(zhè)樣的工具庫,使得利用OpenGL ES的老應用程序也(yě)能(néng)順利得在Vulkan接口上(shàng)面運行,而不需要更改任何代碼。
第三種應用場(chǎng)景就(jiù)是應用程序直接調用遊戲引擎。因為(wèi)應用程序不需要考慮如(rú)何用Vulkan實現(xiàn),所以應用程序的實現(xiàn)比較簡單。而專業的遊戲引擎廠商(shāng)負責優化(huà)對Vulkan的調用,使得應用可以獲得Vulkan帶來(lái)的性能(néng)提升。
3.4. Vulkan多線程支持
Vulkan作(zuò)為(wèi)一(yī)個(gè)直接提供GPU硬件功能(néng)的接口而不在負責多線程渲染的調度以及線程并發訪問的安全保護等工作(zuò),這(zhè)意味着Vulkan接口内部不再像OpenGL ES一(yī)樣有過度的線程同步,CPU/GPU同步等操作(zuò)。這(zhè)些(xiē)操作(zuò)會為(wèi)接口的運行效率帶來(lái)不可預測的影響。如(rú)上(shàng)圖所示,每個(gè)獨立的線程都可以并行地生(shēng)成渲染的command buffer,這(zhè)些(xiē)command buffer最後會被提交給一(yī)個(gè)統一(yī)的command queue,GPU會按照command buffer提交的順序來(lái)執行。任何需要跨線程訪問的資源,都需要應用自己保證訪問的一(yī)緻性。
3.5. Vulkan的shading language環境
Vulkan不再使用GLSL作(zuò)為(wèi)shading language的輸入,而是使用一(yī)個(gè)統一(yī)的中間(jiān)代碼(SPIR)作(zuò)為(wèi)輸入。OpenGL/OpenGL ES或者遊戲引擎使用的GLSL都會被一(yī)個(gè)SPIR-V解釋器(qì)翻譯成SPIR表示。未來(lái)其它的shading language或者通用計算(suàn)的語言也(yě)會被翻譯成SPIR作(zuò)為(wèi)Vulkan的輸入。這(zhè)可以使Vulkan驅動專注于shader的後端優化(huà),而不是前端的語法解析,語義分(fēn)析等。對于GLSL轉SPIR,Khronos正在考慮實現(xiàn)一(yī)個(gè)編譯器(qì)前端來(lái)幫助應用程序轉換。
3.6. Vulkan工具架構
Vulkan提供靈活的架構可以使應用按照需求來(lái)啓用驅動的錯誤檢測和調試信息。如(rú)果應用是一(yī)個(gè)驗證良好(hǎo)(hǎo)的程序,那麽應用就(jiù)直接使用Vulkan接口來(lái)訪問GPU,不做任何的錯誤檢測和調試,這(zhè)可以節約大量的CPU開銷,提升應用的性能(néng)。反之,應用可以通過Vulkan提供的Debug Layer和Validation Layer來(lái)實現(xiàn)錯誤檢測和調試信息的輸出。這(zhè)使得應用在開發調試時(shí)可以獲得大量的有用信息。一(yī)旦應用發布又可以去除掉這(zhè)些(xiē)CPU開銷,使得性能(néng)提升。