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))