Embedded GPU Android GPUI OpenGL ES Android Cyclone Google 車載資通訊 行動裝置 SoC App 蘋果 3D

嵌入式GPU發威 行動3D視覺體驗亮眼

蘋果與Google兩大陣營所推出的行動裝置,在市場上多有斬獲,其行動裝置內的嵌入式繪圖處理器(Embedded GPU)擔負運算與顯示的重責大任。本文將就Android陣營的Embedded GPU相關技術發展進行探討,包括新的RenderScript繪圖架構及資策會自行開發的Cyclone。
Android已經成為成長最快的行動裝置作業系統,其快速的普及、漸趨成熟的應用開發體系以及開放的特性,成為我國軟硬體相關廠商發展產品的重要使力點。這裡所探討的Embedded GPU與一般個人電腦(PC)的繪圖處理器(GPU)不同。一般個人電腦或筆記型電腦(NB)中的GPU多是獨立的晶片,並整合在顯式卡或主機板上。而Embedded GPU則多是以矽智財(IP)的形式,與中央處理器(CPU)等其他IP整合成系統單晶片(SoC)。包括高通(Qualcomm)Snapdragon、輝達(NVIDIA)Tegra、蘋果(Apple)A5等,都是這種整合多種IP的SoC。

Embedded GPU應用普及

Embedded GPU近幾年快速蓬勃發展的主要動力來自於蘋果的iPhone與Google的Android。在iPhone推出前,雖然已經有某些硬體如OMAP3等支援三維(3D)加速,然而因缺乏足夠且吸引人的內容以及完善的內容應用下載環境,因此無法讓裝置開發商願意採用這些硬體。

而開放的Android環境與Android Market上越來越多的應用程式(App),則讓裝置品牌廠與白牌廠商紛紛採用Android系統,進而快速地推升搭載Embedded GPU硬體平台的出貨量。蘋果與Google進一步的擴展其產品至聯網電視領域上,則進一步把Embedded GPU的需求帶入新一代的電視與機上盒(STB)市場。

此外,Embedded GPU亦被應用到車載資通訊系統中的儀表板系統與導航系統,包括富士通(Fujitsu)、瑞薩電子(Renesas Electronics)等皆推出具Embedded GPU的車載硬體解決方案,NVIDIA也宣布其Tegra平台被奧迪(Audi)、寶馬(BMW)、Tesla等車廠採用為其車載資通訊系統的硬體。根據資策會產業情報研究所(MIC)相關市場調查報告,包括智慧型手機、功能型手機(Feature Phone)、平板電腦、機上盒與車機等產品,在2015年將會有約二十一億台的出貨是搭載Embedded GPU。

Embedded GPU的功能取決於其所支援的3D應用程式介面(Application Programming Interface, API),而目前在行動裝置等嵌入式產品市場中,3D API的主流為OpenGL ES。

OpenGL ES目前有兩個版本,包括支援固定功能(Fixed Function)的OpenGL ES 1.x與可程式化(Programmable)的OpenGL ES 2.0。固定功能係指透過3D API設定Lighting與Shading模式以及給定的貼圖(Texture)來決定成像的結果;可程式化則是透過著色(Shader)此種繪圖程序來決定成像的結果。OpenGL ES 2.0支援Vertex Shader來計算頂點(Vertex)的資料,如座標轉換,與支援Pixel Shader來計算每個畫素(Pixel)的顏色值。

現階段,OpenGL ES 1.x為多功能手機的主流API,而OpenGL ES 2.0則是iPhone、iPad、Android等中高階平台的主流。隨著微軟(Microsoft)與諾基亞(Nokia)所合作開發的Windows Phone進入市場,DirectX 9將可能占有部分的市場。不過,在蘋果與Google的持續支持下,可以預期的是OpenGL ES將仍是嵌入式產品的主流3D API。

GPU強化Android顯示功能

在Android中並沒有Windowing的架構,所有的應用程式皆以Surface的方式做繪圖與顯示。Android中有幾種繪圖方式,包括Canvas-2D Drawing Context、Skia-2D Drawing API、OpenGL ES 1.0-3D Rendering API,以及Android 2.2之後開始支援的OpenGL ES 2.0規格。

為確保所有的APP皆能正常在各個Android平台上執行,Android以軟體實作OpenGL ES API- libAGL.so。若運行裝置上沒有GPU的話,則以CPU軟體來處理3D繪製;而若Android裝置有硬體GPU可用來加速3D繪製,則由GPU所提供的驅動程式(Driver)把3D圖形轉交給GPU去運算,效能會好許多。

開發者所寫的應用程式可以使用Canvas透過Skia函式庫繪製、直接使用OpenGL ES 1.x Fixed API去繪製3D圖形,或使用OpenGL ES 2.0的Shader,而開發者得選用相對應的Surface去繪圖。而Android Framework中SurfaceFlinger去判斷哪些Surface該顯示,再透過SurfaceCompositor去把多個不同Surface顯示的畫面疊合在Framebuffer上(圖1)。

資料來源:curious-creature.org
圖1 Android的SurfaceCompositor架構圖

Android 3.0之後把常用的2D使用者介面(UI)元件(Component)繪製方式全部重寫,稱為UI on the GPU,簡稱GPUI。GPUI的基本運作概念是將每個2D UI Component皆轉換成兩個三角形的物件去貼圖,這部分的觀念跟先前Android版本在處理LayerBuffer的作法一樣。而藉由GPU的處理,在Shading、Alpha Blending等等運算上,速度會比原本使用Cavans+Skia+Pixelfligner快許多。

對開發者而言,Android GPUI提供多種不同層級硬體加速(Hardware Acceleration)設定,可分別針對Application、Activity、Window、View去設定是否使用硬體加速繪製。包括List、Button、Path等等標準2D UI Component,若APP中僅使用標準Drawable元件,程式開發員可以打開硬體加速繪製的功能,以使用GPU進行硬體加速繪製。

資料來源:谷歌
圖2 Android中使用GPUI繪製List View的示意圖
開發者也可利用View.isHardwareAccelerated
()/Canvas.isHardware
Accelerated()來得知所運行的平台是否支援GPU硬體加速,用以選擇所使用的UI Component,以達最佳顯示效果。在Android發展中,愈來愈多應用程式使用3D硬體加速繪製去做UI特效處理,而Android本身亦利用GPU的特性針對2D UI Component做最佳化,GPU在Android的應用上扮演愈來愈重要的角色(圖2)。

RenderScript繪圖新架構浮現

以往使用者要使用GPU硬體的資源,會使用Android上的GLSurfaceView搭配OpenGL ES 1.0的class package-javax.microedition.khronos.opengles.GL10,這是將OpenGL ES 1.0 API直接Binding的Package,透過這個Package,使用者可以間接呼叫OpenGL ES 1.0的函式來繪製3D。而目前已經走向可程式化的OpenGL ES 2.0,透過OpenGL ES 2.0的可程式化Shader可繪製更多更絢麗的特效,但是使用者必須要透過NDK的路徑方能使用GPU的資源,不但增加使用的困難度,同時降低可攜性,不同平台使用不同的GPU硬體就必須重新編譯過。

有鑑於此,Google在Android 3.0正式引進RenderScript讓使用者可以開發跨平台的高效能3D圖形的APP。RenderScript不但能夠處理3D圖形的繪製,同時也支援現正流行的平行運算,類似NVIDA的CUDA以及開放式的平行運算程式介面OpenCL,只要底層的GPU硬體有支援這樣的功能,RenderScript也將可以讓使用者方便開發跨平台的平行運算程式。未來,平行運算將可以加入更多多媒體的應用,如影像解碼、照相特效等等視覺的應用。

因為RenderScript同樣採用JIT(Just In Time)的技術,不是事先就編譯好的程式,而是在執行中才動態編譯。同時,RenderScript會根據平台上的硬體做最佳化的動態編譯,並且編譯後的Bytecode將快取(Cache)在裝置上,使得未來再次使用時便不須要再花時間重新編譯一次。因此,RenderScript可同時兼顧跨平台和高效能,讓開發者更直接地編寫高效能的繪圖與高計算的應用。

因為Android不像是蘋果iPhone或iPad這類高度軟硬體整合的產品,Android是由不同的硬體供應商來提供硬體平台,並整合其韌體(Firmware)到上面的作業系統,才到開發者可使用的Android Framework Library。所以要兼顧的東西非常多,唯有使用RenderScript這樣的架構,才可以完全發揮底層GPU硬體的能力,讓上面的應用得到高效能的優勢,是一個不可忽視的重大進展。

這同時對於底層的GPU硬體供應商也是一大福音,因為只要有RenderScript,開發者將不必知道底層的GPU硬體是哪家廠商提供的,只要專注於RenderScript程式的開發即可,剩下的就交給Google去煩惱。

資策會自行開發Cyclone

考量到Embedded GPU的角色越來越重要,但台灣目前尚無專業的Embedded GPU解決方案提供者,來提供相關廠商合適的Embedded GPU Soft IP,因此資策會在3年前開始與台大陳良基教授和簡韶逸教授合作,基於其串流處理器(Stream Processor)技術發展自主Embedded GPU技術。

資策會所開發的Embedded GPU代號為Cyclone,是一個定位在輕量但功能完整之小而美的Embedded GPU架構。Cyclone的架構主要支援OpenGL ES 2.0,並透過Shader技術達到支援OpenGL ES 1.0。以下由3D固定功能與著色處理器(Shader Processor)兩個面向簡要說明Cyclone的架構設計特色。

3D固定功能
  GPU的硬體效能可分為幾個方向來討論,第一點是圖形處理的固定電路模組,這對於圖形處理的效能規格有直接的影響,如每秒可處理多少的三角形(Vertex Processing Rate)以及每秒可填充多少個畫素(Pixel Fill Rate)等數據。影響這些效能數據的模組包括Rasterizer、Texture Unit和ROP Unit等固定功能模組。在Cyclone的Rasterizer中,該團隊發展出Clipping-free技術,使得在Raterizer運算前不須要對超過視野範圍(View Frustum)的三角形做裁切(Clipping),便可讓Rasterizer直接處理該三角形。

此Clipping-free技術透過計算尋找相機空間中視野範圍的合法區域,也就是須要正確繪製到螢幕上的區域,並計算出對應的內插方程式,利用這些計算出的方程式內插畫素的座標,便可以正確地繪製出螢幕上的圖形,而不必再對三角形先實施針對視野範圍切割成數個三角形的計算,節省許多的計算,同時降低硬體的成本,使得電路面積降低。

另外,Cyclone也設計成可以讓Draw Call可以重疊,讓更多的運算資料可以不間斷地進入Cyclone,讓這些數值邏輯單元不斷地被使用,讓效能盡可能地提升。為了降低因存取外部記憶體過多導致效能低下與耗電增加,開發團隊應用如Post-transform Vertex Cache、Hierarchical-Z、Early-Z Culling、Z-Compression等技術降低不必要的Vertex與Pixel處理工作,再加上Clock-gating機制動態暫停毋須運作的模組,使得電源的消耗得以進一步降低。

Shader Processor
  Shader Processor負責執行Shader,計算每個Vertex與Pixel的結果。在Shader Processor運算核心架構上,Cyclone的設計是一個五階層(Stage)超長指令集(VLIW)的計算管線,這樣的設計可以更有效地利用這些數值邏輯單元(ALU)讓效能提高。另一方面,開發團隊也使用Unified Shader架構,讓Vertex和Pixel的資料可以同時被執行,因此可配合Vertex-bound或Pixel-bound的特性而有較好負載平衡。

對於執行時間不定且長的貼圖指令時,為了不讓Shader Processor內的運算資源閒置導致效能下降,將Cyclone的Shader Processor設計為多個執行緒,當遇到長指令時,便可以置換其他執行緒讓這些硬體資源保持運作狀態,來將這些長指令的影響降低(Latency Hiding)以提高效能。

支援立體3D顯像

自阿凡達(Avatar)這部電影推出後,眾多媒體與廠商紛紛宣稱開始進入立體視覺體驗的年代。今年暑假的賣座強片,如變形金剛3以及哈利波特等,都支援立體視覺。在越來越多支援立體視覺的影片支撐下,許多廠商所推出的高階平面電視也以支援立體視覺為主要的賣點。這股立體視覺風潮也吹到行動裝置中,特別是在任天堂(Nintendo)推出3DS讓消費大眾體驗到3D立體遊戲的獨特性。

不同於電影或電視,行動裝置如3DS因為其單人近距離使用的特性,都是支援裸眼立體視覺。包括三星(LG)與宏達電皆在今年推出具立體視覺的產品,中國移動也宣稱具立體視覺功能的行動電話是它們未來發展的重點之一,未來行動裝置將有可能成為3D立體內容的主要載具,而Embedded GPU是否支援3D立體顯示,將直接影響到3D立體內容顯示的流暢度。

圖3 從螢幕向外飛出的效果--要讓物體看起來像是在螢幕前面,須讓物體在左眼的影像中向右偏移,而右眼的影像中須向左偏移。
立體3D顯像技術已有數十年的歷史,最廣泛被使用的技術是利用兩眼視差產生立體視覺效果。將同一場景兩個角度的成像分別送給左右眼觀看,人腦就會將兩張影像之間差異的部分解釋成立體的成像。

視差立體成像又可以分成兩種,一種是看起來像從螢幕裡向外飛出來的效果(圖3),另一種則是看起來像是往螢幕內部延伸的效果(圖4)。這兩種分別是對物體成像時做不同方向的偏移產生的。

GPU要產生3D立體影像有幾種方法,分別須要修改繪圖流程中不同的階段。其中一種毋須修改既有的流程的方法是在輸出影像之前,參考深度資訊對輸出的顏色畫素做不同程度的偏移。這種方法的好處是幾乎不須要對現有硬體做更動,但成像的立體效果不會很明顯,且必須在輸出影像至螢幕上之前增加額外的處理過程。

圖4 往螢幕內部延伸的效果--要讓物體看起來像是在螢幕後面,須讓物體在左眼的影像中向左偏移,而右眼的影像中須向右偏移。
Cyclone的做法則是修改繪圖流程,在頂點轉換完之後的階段對物體,依據深度和要輸出左眼或右眼的影像做偏移。這種方法產生的立體成像效果很好,但依實作的方式須對硬體或軟體做不同程度的修改。

此法可分成由硬體自動處理或是由軟體來控制兩種做法。由硬體自動處理的好處是不太須要修改既有軟體即可產生立體影像,但是有可能因為誤判產生錯誤的結果。軟體控制的做法效果最好,但須要對軟體做修改,才可以產生立體影像。

最後產生的3D立體影像結果會依據3D立體成像螢幕的不同而使用不同的格式。以裸眼立體視覺來說,常用的有遮蔽式螢幕和凹凸曲面螢幕兩種,這兩種方式都須要使用左右眼交錯混合的影像才能看到立體效果。但若是使用3D眼鏡的主動式快門方式,則須分別產生完整的左眼影像和右眼的影像,由螢幕交錯輸出兩眼影像以得到立體成像的效果。

(本文作者任職於資策會智慧網通系統研究所)

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!