1.名詞解釋
GPU:Graphic Processing Unit (圖形處理器)
OpenGL:Open Graphic Library 定義了一個跨編程語言、跨平台的編程接口的規格,不同廠商會有不同的實現方法,它主要用於三維圖象(二維的亦可)繪制。
SurfaceFlinger:Android中負責Surface之間疊加、混合操作的動態庫
Skia:Android中的2D圖形庫
libagl:Android中通過軟件方法實現的一套OpenGL動態庫
libhgl:為區別libagl,自定義的一種叫法。特指GPU廠商提供的硬件實現的OpenGL
composition:特指SurfaceFlinger對各個Surface之間的疊加、混合操作
render:特指使用OpenGL動態庫進行3D渲染
copybit:Android使用2D引擎來加速圖形操作(主要是Surface之間的composition操作)的一種技術,對應著一個或幾個動態庫。
pmem:Android特有驅動,從linux內核中reserve物理連續內存,可以為2d、3d引擎、vpu等設備分配物理連續內存。
2 3D、2D引擎在Android中的使用方法
2.1 Android如何使用2D、3D引擎
Android在啟動後,會在運行時根據配置文件加載OpenGL(libagl & libhgl)的實現,如果有libhgl實現,默認使用libhgl實現,否則使用libagl實現。
Android OpenGL動態庫使用方法:
1. 判斷是否含有egl.cfg文件,如果沒有在加載libagl
2. 如果有egl.cfg文件,則解析egl.cfg文件,根據egl.cfg文件加載對應libhgl和libagl
3. 分別解析libagl和libhgl,獲取libagl和libhgl中標准OpenGL函數的函數地址(函數指針)
4. 系統在執行過程中,會通過函數指針調用到libagl或者libhgl中去,從而實現圖形的繪制。
OpenGL在Android中兩個作用:
1. 用於Surface的composition操作。
SurfaceFlinger會調用到OpenGL中,通過libagl或者libhgl做Surface的組合、疊加操作。
2. 用於圖形圖像的渲染
Android framework會對OpenGL實現進行java層次的簡單封裝,在java應用程序中對OpenGL的調用最終會調用到libagl或者libhgl中去。
很多第三方游戲、3D圖庫、某些launcher會使用OpenGL實現比較炫麗UI的特效。
Copybit在Android中的作用
Copybit在Android中主要用於Surface的composition操作。
Skia在Android中的作用
Skia是Android的2D圖形庫,用於繪制文字、幾何圖形、圖像等。
Skia的設備後端:Raster、OpenGL、PDF
Skia是否支持硬件加速?(此乃官方說明,我只是翻譯。)
參考http://code.google.com/p/skia/wiki/FAQ
1. Skia子類SkCanvas
由於所有的繪圖操作都會通過SkCanvas子類,這些繪圖可以重定向到不同的圖形API。SkGLCanvas已經可以將繪圖操作直接指向對OpenGL的調用。參考src/gl目錄
2. 自定義存在瓶頸的調用
Skia中的某些blit操作存在瓶頸,可以利用CPU的一些特性去重寫這些操作。比如在ARMV7設備上可以使用NEON SIMD指令進行優化。參考src/opts目錄
2.2 使用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可能需要做部分修改