1. 程式人生 > >android中如何使用GPU實現硬體加速,3D渲染

android中如何使用GPU實現硬體加速,3D渲染

已開通新的部落格,後續文字都會發到新部落格

http://www.0xfree.top

---

首先來看一些名詞解釋

    GPU:Graphic  Processing Unit (圖形處理器)
    OpenGL:Open  Graphic Library 定義了一個跨程式語言、跨平臺的程式設計介面的規格,不同廠商會有不同的實現方法,它主要用於三維圖象(二維的亦可)繪製。
    SurfaceFlinger

Android中負責Surface之間疊加、混合操作的動態庫
    SkiaAndroid中的2D圖形庫
    libaglAndroid中通過軟體方法實現的一套OpenGL動態庫
    libhgl為區別libagl,自定義的一種叫法。特指GPU廠商提供的硬體實現的OpenGL
    composition特指SurfaceFlinger對各個Surface之間的疊加、混合操作
    
render特指使用OpenGL動態庫進行3D渲染
    copybit:Android使用2D引擎來加速圖形操作(主要是Surface之間的composition操作)的一種技術,對應著一個或幾個動態庫。
    pmemAndroid特有驅動,從linux核心中reserve物理連續記憶體,可以為2d、3d引擎、vpu等裝置分配物理連續記憶體。

 3D、2D引擎在Android中的使用方法
   1、Android如何使用2D、3D引擎
    Android在啟動後,會在執行時根據配置檔案載入OpenGL(libagl & libhgl)的實現,如果有libhgl實現,預設使用libhgl實現,否則使用libagl實現。


     
   2、Android OpenGL動態庫使用方法
    1. 判斷是否含有egl.cfg檔案,如果沒有在載入libagl
    2. 如果有egl.cfg檔案,則解析egl.cfg檔案,根據egl.cfg檔案載入對應libhgl和libagl
    3. 分別解析libagl和libhgl,獲取libagl和libhgl中標準OpenGL函式的函式地址(函式指標)
    4. 系統在執行過程中,會通過函式指標呼叫到libagl或者libhgl中去,從而實現圖形的繪製。
     
   3、OpenGL在Android中兩個作用
    1用於Surface的composition操作
             SurfaceFlinger會呼叫到OpenGL中,通過libagl或者libhgl做Surface的組合、疊加操作。
    2)用於圖形影象的渲染
             Android framework會對OpenGL實現進行java層次的簡單封裝,在java應用程式中對OpenGL的呼叫最終會呼叫到libagl或者libhgl中去。
             很多第三方遊戲、3D相簿、某些launcher會使用OpenGL實現比較炫麗UI的特效。
     
   4、Copybit在Android中的作用
    Copybit在Android中主要用於Surface的composition操作。
     
     
    5、Skia在Android中的作用
    Skia是Android的2D圖形庫,用於繪製文字、幾何圖形、影象等。
    Skia的裝置後端:Raster、OpenGL、PDF
    
 使用GPU硬體加速需要做的工作
    1. Linux核心方面
             1.1新增GPU驅動支援,以模組方式編譯GPU驅動,Android啟動時載入核心模組。
             1.2新增PMEM支援,預留記憶體供GPU使用
    2. Android方面
             2.1新增copybit HAL
    我們使用copybit呼叫2D engine對surface composition進行硬體加速。這樣可能會達到更大的效能提升效果(比起使用3D  engine)。
             2.2修改gralloc
    gralloc負責視訊記憶體等的分配,以及對framebuffer操作。如果使用copybit,必須修改gralloc
             2.3修改libagl
    如果使用copybit,必須修改libagl,對libagl做部分hack,使之能夠呼叫到copybit。
             2.4修改surfaceflinger
             如果使用 copybit可能需要做部分修改

  
3D效能提升
(有很多人問,這樣會不會增加耗電什麼的,我覺得只會減少耗電,畢竟3D本來就是gpu的強項,之所以系統還會呼叫cpu,是為了保證相容性。只會讓系統優先呼叫gpu)

具體辦法如下:

用Root Explorer開啟 /system/lib/egl 
長按並選擇開啟egl.cfg檔案
會有一下:
0 0 android
0 1 adreno200
刪去第一行,使之成為: 0 1 adreno200
原理說明:
本檔案的作用是幫助系統選擇“在某些3D應用時,使用cpu還是gpu來解碼”,0為是,1為否。
即每行語法如下: 情況A是否呼叫 情況B是否呼叫 呼叫什麼

可以看到,原設定是,在情況A下,cpu和gpu都可以被選擇,而情況B下則選擇cpu。
問題就出在這個情況A,很多軟體會預設選擇cpu,可能因為它在第一行,所以我們要更改這一設定
更改有三種方法,都是在xda上被廣泛認可的:
1.刪除cpu的解碼包(同文件夾下的libGLES_android.so),很野蠻,可能會出問題,強烈不推薦
2.將第一行的兩個0改成兩個1,使之成為: 
0 0 android
0 1 adreno200
這樣就迫使軟體使用gpu。那為什麼不改成1 0呢?因為大神們還沒搞清楚情況A和情況B的對應關係
3.如本人所述,直接刪除第一行。軟體預設使用gpu,因為沒有cpu的描述,在gpu失敗的情況下,系統還是會繼續使用cpu