surfaceflinger & opengl es

1,OpenGL ES與EGL


OpenGL ES 定義了一個渲染圖形的 API,但沒有定義窗口系統(tǒng)。為了讓 GLES 能夠適合各種平臺,GLES 將與知道如何通過操作系統(tǒng)創(chuàng)建和訪問窗口的庫結(jié)合使用。用于 Android 的庫稱為 EGL。如果要繪制紋理多邊形,應使用 GLES 調(diào)用;如果要在屏幕上進行渲染,應使用 EGL 調(diào)用。
OpenGL ES 其實是一個圖形學庫,由 109 個 API 組成,EGL 包含了 34 個 API。

下面是Android源碼中OpenGL ES相關(guān)的幾個代碼路徑——

Java層SDK:frameworks/base/opengl/java
JNI層實現(xiàn):frameworks/base/core/jni
C++代碼實現(xiàn):frameworks/native/opengl
Mesa3D引擎庫:external/mesa3d

具體作用為:

#本地代碼:
framework/base/opengl/libs/egl
Android EGL框架,負責加載OpenGL函數(shù)庫和EGL本地實現(xiàn)。
framework/base/opengl/libagl  
Android提供的OpenGL軟件庫
#JNI代碼:
framework/base/core/jni/com_google_android_gles_jni_EGLImpl.cpp
EGL本地代碼的JNI調(diào)用接口
framework/base/core/jni/com_google_android_gles_jni_GLImpl.cpp
framework/base/core/jni/android_opengl_GLESXXX.cpp
OpenGL功能函數(shù)的JNI調(diào)用接口
#Java代碼:
framework/base/opengl/java/javax/microedition/khronos/egl
framework/base/opengl/java/javax/microedition/khronos/opengles
framework/base/opengl/java/com/google/android/gles_jni/
framework/base/opengl/android/opengl
EGL和OpenGL的Java層接口,提供給應用開發(fā)者,通過JNI方式調(diào)用底層函數(shù)。

2,關(guān)于軟件渲染(cpu)與硬件渲染(gpu)


Android繪制時可采用兩種方式:Canvas和OpenGL。android.graphics.Canvas 是Android中的2D繪制API,如果不開硬件加速,就是軟件渲染,如果開了硬件加速,就是硬件渲染,內(nèi)部是通過OpenGLRenderer這個類將Canvas的繪制交給cpu。Android 4.0之后默認開啟了硬件加速。
如果是軟件渲染,在收集階段,就會將對應的繪制指令全部渲染到一個Bitmap中,然后將這個Bitmap記錄到父View的DisplayList中,執(zhí)行階段,將整個Bitmap作為紋理直接上傳到GPU中,如果是硬件渲染,只需將對應的繪制指令記錄到DisplayListCanvas中,在執(zhí)行階段的時候,再去真正的執(zhí)行DisplayListCanvas中的指令。

參考:

Android 重學系列 渲染圖層-OpenGL es上的封裝(上)
Android 重學系列 渲染圖層-OpenGL es上的封裝(下)

OpenGL ES: (3) EGL、EGL繪圖的基本步驟、EGLSurface、ANativeWindow
OpenGL ES: (4) EGL API詳解 (轉(zhuǎn))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容