Android 通过 OpenGL 包含了对高性能 2D 和 3D 图形的支持,特别是 OpenGL ES API。OpenGL 是一个跨平台的图形 API,它为 3D 图形处理硬件规定了一个标准的软件接口。OpenGL ES 是一种用于嵌入式设备的 OpenGL 规范。Android 支持多种版本的 OpenGL ES API:
- OpenGL ES 1.0 和 1.1 - Android 1.0 及更高版本支持这个 API 规范。
- OpenGL ES 2.0 - Android 2.0(API level 8)及更高版本支持这个 API 规范。
- OpenGL ES 3.0 - Android 4.3(API level 18)及更高版本支持这个 API 规范。
- OpenGL ES 3.1 - Android 5.0(API level 21)及更高版本支持这个 API 规范。
注意: 设备上对 OpenGL ES 3.0 API 的支持需要设备生产商提供这个图形管线的实现。运行 Android 4.3 或更高版本的设备 可能不 支持 OpenGL ES 3.0 API。在运行时检查支持何种版本的 OpenGL ES 的信息,请参考 Checking OpenGL ES Version。
注意: Android framework 提供的特别的 API 与 J2ME JSR239 OpenGL ES API 类似,但不完全一致。如果你对 J2ME JSR239 比较熟悉,请注意其中的不同。
Android 同时通过它的 framework API 和 NDK 支持 OpenGL。这里主要来看 Android framework 的接口。Android framework 中提供了多个接口让我们可以通过 OpenGL ES 创建并管理图形:GLSurfaceView,TextureView,SurfaceView 等等。如果是要在实际的应用中使用 OpenGL,则 GLSurfaceView 最好用。
为了能够更清晰地厘清,EGL 为 OpenGL 渲染做环境准备的过程,以及 EGL contexts 的管理,这里使用 SurfaceView。示例 OpenGL 应用程序代码(完整代码可以在 GitHub 获取)如下:
SurfaceView
的 SurfaceHolder
为 OpenGL 的渲染提供画布,即 Surface,它决定图像被实际渲染到什么地方。在上面的代码中,Activity
的整个 layout 中就只有一个 SurfaceView
,它被用于获取 SurfaceHolder
。
上面的代码中,SurfaceView
的 Surface 创建好之后,起了一个单独的线程,这个线程用于处理在该 Surface 上渲染的所有事情。
在能够使用 OpenGL 渲染之前,首先需要为渲染做环境上的准备,即创建 EGL context,并启用它。这通过如下的方法完成:
这个过程如下:
- 获得
EGLDisplay
对象。 - 初始化
EGLDisplay
对象。 - 选择
EGLConfig
。 - 基于
SurfaceHolder
创建 Windows Surface。 - 创建 EGL context。
- 启用前面创建的 EGL context。
随后就可以使用 OpenGL 做渲染了。
每次一个场景渲染完成,都需要通过交换缓冲区来显示渲染结果:
整个渲染过程结束之后,还需要销毁前面创建的 EGL context:
而 framework 的 GLSurfaceView
类提供了一些辅助类来管理 EGL contexts,线程间通信,以及与 Activity 生命周期的交互,仅此而已。大多数时候,GLSurfaceView
可以简化我们对 OpenGL ES 的使用。
打赏
Done.
Android OpenGL 图形系统分析系列文章
在 Android 中使用 OpenGL
Android 图形驱动初始化
EGL Context 创建
Android 图形系统之图形缓冲区分配
Android 图形系统之gralloc