背景介紹前端
Vulkan是Khronos組織制定的「下一代」開放的圖形顯示API。是與DirectX12可以匹敵的GPU API標準。微信
Vulkan是基於AMD的Mantle API演化而來,眼下Vulkan 1.0標準已經完畢並正式公佈。下圖是Vulkan的效果:多線程
上一代的OpenGL|ES並不會被遺棄。還會繼續發展,很是有可能OpenGL|ES變爲Vulkan的簡化API。架構
Vulkan的優點框架
與OpenGL|ES相比Vulkan的優點:機器學習
一、更簡單的顯示驅動層工具
Vulkan提供了能直接控制和訪問底層GPU的顯示驅動抽象層。顯示驅動僅僅是對硬件薄薄的封裝,這樣可以顯著提高操做GPU硬件的效率和性能。以前OpenGL的驅動層對開發人員隱藏的很是多細節,現在都暴露出來。Vulkan甚至不包括執行期的錯誤檢查層。驅動層乾的事情少了,隱藏的bug也就少了。性能
二、支持多線程學習
Vulkan再也不使用OpenGL的狀態機設計,內部也不保存全局狀態變量。顯示資源全然由應用層負責管理。包括內存管理、線程管理、多線程繪製命令產生、渲染隊列提交等。測試
應用程序可以充分利用CPU的多核多線程的計算資源,下降CPU等待,下降延遲。帶來的問題是。線程間的同步問題也由應用程序負責,從而對開發人員的要求也更高。
三、預編譯Shaders
驅動層不提供前端shader編譯器。僅僅支持標準可移植中間表示二進制代碼(SPIR-V)。
即提升了執行Shaders的效率又添加了未來着色語言的靈活性。
因此眼下的GLSL/HLSL可以直接經過工具轉換爲SPIR-V。在Vulkan中使用。這樣就可以使用離線的shader編譯。
另外。SPIR-V還支持OpenCL!
四、跨平臺
支持桌面、移動設備、遊戲主機、嵌入式……僅僅要需要顯示的地方,貌似都能支持。
這也是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萬+碼農成長充電第一站,陪有夢想的你一塊兒成長。