1,OpenGL ES与EGL
OpenGL ES 定义了一个渲染图形的 API,但没有定义窗口系统。为了让 GLES 能够适合各种平台,GLES 将与知道如何通过操作系统创建和访问窗口的库结合使用。用于 Android 的库称为 EGL。如果要绘制纹理多边形,应使用 GLES 调用;如果要在屏幕上进行渲染,应使用 EGL 调用。
OpenGL ES 其实是一个图形学库,由 109 个 API 组成,EGL 包含了 34 个 API。
下面是Android源码中OpenGL ES相关的几个代码路径——
Java层SDK:frameworks/base/opengl/java
JNI层实现:frameworks/base/core/jni
C++代码实现:frameworks/native/opengl
Mesa3D引擎库:external/mesa3d
具体作用为:
#本地代码:
framework/base/opengl/libs/egl
Android EGL框架,负责加载OpenGL函数库和EGL本地实现。
framework/base/opengl/libagl
Android提供的OpenGL软件库
#JNI代码:
framework/base/core/jni/com_google_android_gles_jni_EGLImpl.cpp
EGL本地代码的JNI调用接口
framework/base/core/jni/com_google_android_gles_jni_GLImpl.cpp
framework/base/core/jni/android_opengl_GLESXXX.cpp
OpenGL功能函数的JNI调用接口
#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层接口,提供给应用开发者,通过JNI方式调用底层函数。
2,关于软件渲染(cpu)与硬件渲染(gpu)
Android绘制时可采用两种方式:Canvas和OpenGL。android.graphics.Canvas 是Android中的2D绘制API,如果不开硬件加速,就是软件渲染,如果开了硬件加速,就是硬件渲染,内部是通过OpenGLRenderer这个类将Canvas的绘制交给cpu。Android 4.0之后默认开启了硬件加速。
如果是软件渲染,在收集阶段,就会将对应的绘制指令全部渲染到一个Bitmap中,然后将这个Bitmap记录到父View的DisplayList中,执行阶段,将整个Bitmap作为纹理直接上传到GPU中,如果是硬件渲染,只需将对应的绘制指令记录到DisplayListCanvas中,在执行阶段的时候,再去真正的执行DisplayListCanvas中的指令。
参考:
Android 重学系列 渲染图层-OpenGL es上的封装(上)
Android 重学系列 渲染图层-OpenGL es上的封装(下)
OpenGL ES: (3) EGL、EGL绘图的基本步骤、EGLSurface、ANativeWindow
OpenGL ES: (4) EGL API详解 (转)