去年12月,高通宣布率先開放 GPU 驅動更新,驍龍865、驍龍765等系列將在後期獲得公開的 GPU 驅動更新,首批支持的機型有小米10/10Pro和 Redmi K30 Pro等。基於此點,前些時間小米10系列和 Redmi K30 Pro系列率先支持並提供了國內首次 Adreno GPU 驅動獨立更新,用戶可以像更新應用程式一樣簡單便捷地更新 Adreno GPU 驅動。而此次更新內容主要包括:優化 OpenGL ES 性能,提高崩壞3、和平精英、堡壘之夜遊戲運行的穩定性;優化Vulkan性能等。基於小夥伴們對此可能不是很了解,接下來就讓小編編帶大家一起走進 GPU 的世界吧。
一、 GPU概述
首先,為區分手機 GPU 與電腦 GPU 有關內容,在正式了解 Adreno GPU 驅動更新有關知識前,我們先來了解了解大概念下的 GPU :圖形處理單元(GPU,Graphic Processing Unit),又稱顯示核心、視覺處理器、顯示晶片,是一種專門在個人電腦、工作站、遊戲機和一些行動裝置(如平板電腦、智慧型手機等)上圖像運算工作的微處理器,主要用於管理和提高視頻和圖形的性能,GPU是相對於CPU的一個概念,它與CPU類似,只不過GPU是專為執行複雜的數學和幾何計算而設計的,這些計算是圖形渲染所必需的。
0x01 GPU與CPU的區別:
CPU 由專為順序串行處理而優化的幾個核心組成,功能模塊多,適合複雜的運算環境,大部分電晶體用在控制電路和Cache上,少部分電晶體用來完成運算工作。而 GPU 則由數以千計的更小、更高效專為同時處理多重任務而設計的核心組成,擁有大量的高速內存和一個的大規模並行計算架構,最初被設計用於遊戲,計算機圖像處理等,主要擅長做類似圖像處理的並行計算。GPU的控制相對簡單,且不需很大的Cache,大部分電晶體可被用於各類專用電路和流水線,因此GPU的計算速度大增,擁有強大的浮點運算能力。
CPU和GPU本身架構方式和運算目的不同,CPU主要是負責多任務管理、調度,它是領導者,負責指揮,計算能力方面沒有GPU強。而GPU主要是用於大量的重複計算,它是計算專家,但協議、管理不是它的專長。它的計算執行能力很強。兩者不可相互取代,需融合在一起,互相配合。
0x02 GPU與顯卡的區別:
GPU 是圖像處理晶片,外表與 CPU 相似,它是顯卡的核心,因其並行計算任務較重,功耗較大,一般只能焊接在顯卡的電路板上使用,不能單獨作為外接擴展卡使用。而顯卡也稱顯示適配器,由 GPU、顯存、電路板,還有 BIOS 固件組成的,分為獨立顯卡和主板上集成顯卡兩類。顯卡上都有 GPU,它是區分顯性能的最主要元件。兩者是「寄生與被寄生」關係,因而並不等同。(一般情況下,我們所說的 GPU 即指顯卡)
0x03 GPU的功能:
l 紋理映射l 硬體覆蓋 l 渲染多邊形 l MPEG 解碼 l 支持 YUV 色彩空間l 二維或三維圖形處理和渲染 l 數字輸出到平板顯示器監視器 l 應用程式支持 AutoCAD 等高強度圖形軟體以上功能可減少 CPU 的工作並產生更快的視頻和圖形。
二、Adreno GPU 簡介
Adreno GPU 是 Qualcomm Snapdragon 處理器一體化設計的一部分,開拓性置於 Qualcomm Snapdragon 處理器內部。Adreno 是目前最先進的移動圖形處理背後的發電站,它能加速遊戲、用戶界面和網絡瀏覽器中複雜幾何體的渲染,能夠滿足當今行動裝置的遊戲、用戶界面、Web技術所要求的性能水平,並能以優異的圖形性能帶來良好的移動體驗。Adreno GPU 專為移動API(應用程式接口)和行動裝置限制而設計,重點在於性能和高效的電源使用。最初的 Adreno 130 變體僅支持OpenGL ES 1.1,Adreno 2xx系列及其後續版本支持OpenGL ES 2.0。Adreno 3xx系列增加了對OpenGL ES 3.0和OpenCL的支持。Adreno 4xx增加了對OpenGL ES 3.1和Android Extension Pack的支持。
三、 Adreno GPU的主要功能:
0x01 紋理功能
紋理映射(Texture Mapping)指通過數位化技術把紋理圖案覆蓋或者映射或者投射到三位物體的表面,給物體增加表面細節的過程,是繪製複雜場景真實感圖形最為常用的技術,它可以通過紋理來表達表面豐富的幾何細節和光照細節,甚至可以通過映射後紋理的變形來表達物體的幾何形狀:在未增加物體多邊形數情況下,增強了物體的真實感效果。而Adreno GPU紋理功能包括多紋理 、視頻紋理 、紋理壓縮 、浮點紋理 、無縫邊緣的立方體映射 、3D紋理幾方面;可節省片段著色器的算法邏輯單元(ALU)成本,並避免不必要的頂點變換,顯著提高圖形應用程式的性能和縮短加載時間,減輕了在實時應用中使用陰影貼圖可以看到的鋸齒問題。
0x02 能見度處理(Visibility processing)
1、早期Z拒絕(Early Z rejection)
早期Z拒絕提供了一種快速遮擋方法,可以拒絕從視圖位置看不到(隱藏)的對象的不需要的渲染過程。Adreno 3xx系列可以以高達4倍的繪製像素填充率來抑制被遮擋的像素,這對於具有高深度複雜性的應用有著重大意義。(此項有類於MIUI 12桌面切換至負一屏的高斯模糊效果)
2、混合延遲和直接渲染模式(FlexRenderTM)
QTI(高通技術公司)推出了新的FlexRender解決方案,作為Adreno 3xx的一部分。FlexRender是指GPU在間接渲染(分箱或延遲渲染)和直接渲染到幀緩衝區之間切換的能力。直接渲染模式和延遲渲染模式各有優點。而Adreno GPU 旨在通過動態方式在兩種模式之間切換來獲取最大化性能。
0x03 Shader(著色器)支持
1、統一的shader結構
shader 是專門用來渲染 3D 圖形的一種技 ,通過 shader,程序設計人員可以自己編寫顯卡渲染畫面的算法,使畫面更漂亮、更逼真。shader 又分兩種 ,一種是頂點 shader(3D圖形都是由一個一個三角形組成,頂點 shader 就是計算頂點位置,並為後期像素渲染做準備),另一種是像素 shader,像素 shader 是以像素為單位,計算光照、顏色的一系列算法。而所有 Adreno GPU 都支持統一著色器模型,該模型允許在所有著色器類型(頂點和片段著色器)中使用一致的指令集,從而 Adreno GPU 可根據場景構成智能地最有效地使用著色器資源。
2、標量架構
Adreno 3xx具有標量組件架構。Adreno 3xx可以支持的最小組件是標量組件。這樣可以更有效地使用硬體資源來處理標量組件,並且不會浪費完整的矢量組件來處理標量。與當今使用矢量架構的其他移動GPU相比,Adreno 3xx的標量架構可以提供兩倍的功率效率,並且可以提供兩倍於處理使用中等精度浮點(mediump)的片段著色器的性能。
四、OpenGL ES介紹
OpenGL(Open Graphics Library)定義了一個跨程式語言、跨平臺編程的專業圖形程序接口。可用於二維或三維圖像的處理和渲染,它是一個功能強大、調用方便的底層圖形庫。對於嵌入式設備,其提供了 OpenGL ES(OpenGL for Embeddled Systems)版本,該版本是針對手機、Pad等嵌入式設備而設計的,是 OpenGL 的一個子集,它是從 OpenGL 去除了 glBegin/glEnd(兩者為 OpenGL 函數),四邊形(GL_QUADS)、多邊形(GL_POLYGONS)等複雜圖元等許多非絕對必要特性裁剪定製而來的。而文章開頭說的驅動升級帶來 OpenGL ES優化,便是指三維圖形應用程式接口的優化。
五、Vulkan 介紹
Vulkan是一個跨平臺的二維或三維繪圖應用程式接口(API),與前面OpenGL類似。同OpenGL一樣,Vulkan針對實時3D程序(如電子遊戲)而設計,並計劃提供高性能和低CPU管理負擔,它是 AMD Mantle 的後續版本,繼承了AMD Mantle 強大的低開銷架構,使軟體開發人員能夠全面獲取 GPU 與多核 CPU 的性能、效率和功能。相對於 OpenGL,Vulkan大幅降低了 CPU 在提供重要特性、性能和影像質量時的「API 開銷」(CPU 在分析遊戲的硬體需求時所執行的後臺工作),而且可以使用通常通過 OpenGL 無法訪問的 GPU 硬體特性。
與OpenGL|ES相比Vulkan的優勢:
l 更簡單的顯示驅動層Vulkan提供了能直接控制和訪問底層 GPU 的顯示驅動抽象層, 顯示驅動只是對硬體薄薄的封裝,這樣能夠顯著提升操作GPU硬體的效率和性能。之前 OpenGL 的驅動層對開發者隱藏的很多細節,現在都暴露出來。Vulkan 甚至不包含運行期的錯誤檢查層。驅動層幹的事情少了,隱藏的 bug 也就少了。
l 支持多線程Vulkan 不再使用 OpenGL 的狀態機設計,內部也不保存全局狀態變量。顯示資源完全由應用層負責管理,包括內存管理、線程管理、多線程繪製命令產生、渲染隊列提交等。應用程式可以充分利用 CPU 的多核多線程的計算資源,減少 CPU 等待,降低延遲。帶來的問題是,線程間的同步問題也由應用程式負責,從而對開發人員的要求也更高。
l 預編譯Shaders驅動層不提供前端shader編譯器,只支持標準可移植中間表示二進位代碼(SPIR-V)。即提高了執行Shaders的效率又增加了將來著色語言的靈活性。
六、GPU 驅動升級相關內容:
對於PC遊戲玩家,他們早已熟悉了通過GPU驅動更新來獲得體驗的進化,包括性能優化、功能提升,以及遊戲體驗的持續升級。相比於PC,移動端作業系統和GPU驅動更新機制更為複雜,涉及手機作業系統版本、遊戲兼容性等諸多因素,因此想要在手機上實現這一PC端遊級的體驗,需要整個手機產業鏈的支持。手機驅動此前並不能像電腦一樣安裝,不過現在這種情況已經開始改變,今年的高通旗艦驍龍865已經支持獨立更新GPU驅動。而此次國內使用驍龍865的機型中,小米10系列率先支持並上架了新驅動。
0x01 為何之前安卓沒有GPU驅動升級
安卓之所以長時間以來,沒法像 Windows 那樣靈活升級驅動,是和系統架構息息相關的。安卓基於使用宏內核的Linux,系統內核和驅動等模塊結合緊密。在傳統安卓系統架構中,可見顯示驅動、相機驅動等等都是被打包在 Linux 內核當中的,宏內核將驅動和系統內核耦合在一起,即便是只升級驅動,往往也需要連同系統一起升級。而Windows 的架構更接近於微內核,系統各模塊之間分離度較高,並且微軟為兼容更多硬體,還為驅動設計了如圖形驅動的 WDDM,音頻架構 UAA 等標準模型,只要驅動編寫符合 WDDM、UAA 等架構,就可以自行安裝升級驅動,而無需對系統內核進行改動。
儘管宏內核在驅動升級方面不夠靈活,但因其高耦合度,可以帶來更高的進程間 IPC 通訊效率,更為出色的性能而被廣泛運用。
0x02 為什麼當下又支持GPU驅動升級
在當下移動網際網路/物聯網時代,各式各樣智能設備迅速湧現,不同硬體之間的適配對於宏內核這樣更偏一體的架構就顯得很被動和繁瑣。以安卓機為例,市面上的安卓機使用了不同的 CPU、GPU、基帶、CODEC 等等,由於宏內核的高耦合度,安卓機很難對作業系統和硬體驅動進行單獨升級,無論想要升級系統還是想要升級驅動,廠商都需要為每個安卓機型號單獨製作系統鏡像。但並不是每個廠商都會選擇投入大精力到系統維護當中的,這導致了安卓系統和驅動升級困難,最後的結果就是安卓機系統版本的碎片化。而對此,Google 其實早已察覺,為改變安卓的形態,Google 在安卓8.0中推行了 Project Treble 機制,將系統(Android OS framework)單獨分區,和硬體驅動(Vendor implementation)分離,此後廠商可以為設備單獨推送新版安卓,而不需要重新適配驅動,大大簡化了安卓系統的升級流程。
在之後的安卓10當中,Google 更是推行了一項被認為是安卓至今為止最重要的更新——Project Mainline,系統進一步被細分模塊化。14個系統組件被 Mainline 化,媒體解碼器、權限控制器、網絡組件等系統組件,都可以像普通APP一樣,通過應用商店來更新——小米 GPU 驅動能夠獨立更新,就得益於此。可以說,安卓通過 Project Treble和Project Mainline,正變得越來越「微內核」。各項安卓驅動獨立升級也正變得與 Window 端驅動升級一般簡便與可行。
0x03 GPU驅動升級的優點
1、很多GPU驅動都會對主流遊戲針對性的優化,升級GPU驅動之後,不僅可提高遊戲運行穩定,性還能顯著提升遊戲畫質。而小米此次帶來的GPU 驅動更新升級便對崩壞3、和平精英、堡壘之夜三款遊戲進行優化,提升了三者運行的穩定性,使玩家可獲得更好的遊戲體驗。
2、新版本的GPU驅動可能改善舊版本存在的兼容性問題,更有效的利用GPU的資源,提高遊戲性能。同時還可以進一步挖掘GPU硬體的功能,使得部分硬體功能(特別是Direct 3D部分)得以充分發揮。3、新版驅動有可能會包含對舊版本的驅動的一些 BUG 的修復,以及增加一些新的功能,也可能包含一些對 GPU 驅動要求較高的遊戲的各項優化。
0x04 GPU 驅動更新升級常見問題匯總
好啦,這期有關 GPU 驅動的介紹就先到這裡啦。喜歡小編編文章的小朋友可以點讚+關注Mi_毓珣哈。有大家支持帶來的動力,小編編會為大家帶來更多精彩作品噠!
#小米#
【酷學堂】:為 Mi_毓珣 和 mi小號 共營科普專欄,旨在為小夥伴們提供更多優秀的專業科普內容。「讓技術僅是知識,讓科技就在字裡行間」是我們的創作宗旨,希望大家喜歡並多加支持。
本篇原創內容首發於小米社區,著作權歸創作者@Mi_毓珣 所有,未經允許嚴禁引用轉載或用於商業用途!(部分圖源網絡,侵刪)