面向 Android* 开发人员的英特尔学习系列计划 #11:基于英特尔® 凌动™ 处理器的 Android* 的 OpenGL ES* 支持、性能和特性

1. 简介

适用于基于 Android 的 3D 图形的标准 API 是 OpenGL ES,它是当前所有移动设备上使用最广泛的 3D 图形 API。 Android 使用 OpenGL ES 来加速 2D 和 3D 图形。在早期的 Android 版本中,OpenGL ES 加速在某种程度上并不是必要选项,但是,随着 Android 不断演进以及屏幕尺寸不断增大,加速的 OpenGL ES 成为 Android 图形系统的基本组成部分。

OpenGL ES 的三个版本分别为 1.0 、1.1 和 2.0,其中前两者支持 Android 的所有版本;而 2.0 从 Android 2.2 开始提供支持。今天,Android 开发人员可以选择任意一个版本。表 1 总结了迄今为止所有的主要 Android 版本,以及哪些版本中内置了针对英特尔® 凌动™ 处理器的系统映像。

版本 名称 API 支持 英特尔® 凌动™ 支持
Android 1.5 Cupcake 3 OpenGL ES 1.0  
Android 1.5 Cupcake 3 OpenGL ES 1.0  
Android 1.6 Donut 4 OpenGL ES 1.0, 1.1  
Android 2.0 Eclair 5 OpenGL ES 1.0, 1.1  
Android 2.1 Eclair 7 OpenGL ES 1.0, 1.1  
Android 2.2 Froyo 8 OpenGL ES 1.0、1.1、2.0  
Android 2.3.3 Gingerbread 10 OpenGL ES 1.0、1.1、2.0
Android 3.0 Honeycomb 11 OpenGL ES 1.0、1.1、2.0  
Android 3.1 Honeycomb 12 OpenGL ES 1.0、1.1、2.0  
Android 3.2 Honeycomb 13 OpenGL ES 1.0、1.1、2.0  
Android 4.0 Ice Cream Sandwich 14 OpenGL ES 1.0、1.1、2.0  
Android 4.0.3 Ice Cream Sandwich 15 OpenGL ES 1.0、1.1、2.0
Android 4.1 Jelly Bean 16 OpenGL ES 1.0、1.1、2.0

表 1: 采用集成 OpenGL ES* 以及英特尔® 凌动™ 处理器系统映像的 Android* 版本概述

自 Android 2.3.3 起,Android 可在英特尔凌动平台上使用,包括 OpenGL ES 1.0、1.1 和 2.0。基于英特尔凌动处理器的 OpenGL ES 支持全面的功能,并且优于其他大部分的 Android 解决方案,因为它具备独特的特性组合:

  • PowerVR SGX540 与 SGX544MP2 GPU (频率为 400 MHz 或更高)
  • 更快的浮点
  • 面向 Android 虚拟设备模拟的 x86 系统映像
  • 英特尔® 硬件加速执行管理器(英特尔 HAXM)
  • 英特尔® 图形性能分析器(英特尔 GPA)

英特尔与谷歌联手将继续为 Android 平台提供出色的支持,包括持续不断地为将来的 Android 版本提供 x86 系统映像、英特尔 HAXM 和英特尔 GPA 支持。

2. 面向 Android 虚拟设备模拟的 x86 系统映像

每个嵌入式开发人员都知道虚拟设备模拟器如何加速新应用软件的开发。但是,使用面向 ARM 系统映像的 Android 虚拟设备(AVD)将会非常缓慢,因为 AVD 必须模拟 Windows* 或 Linux* 开发系统上的每一个 ARM 指令。仅在典型的 ARM AVD 上启动 Android 便有可能需要花费 5 分钟或更长的时间。英特尔借助英特尔硬件加速执行管理器(英特尔 HAXM)解决了这一问题。将该工具安装到英特尔 x86 凌动系统映像 AVD 上并配合其使用时,应用开发速度将会得到极大的提升,您甚至不需要英特尔凌动硬件来启动。

请注意,谷歌的 AVD 模拟目前仅支持 OpenGL ES 1.0 和 1.1 开发,而不支持 2.0。这是谷歌模拟软件的局限所在 — 无论 CPU 或 GPU 的架构如何。

3. 英特尔® 图形性能分析器

对于开发基于英特尔凌动处理器的 Android 上的 OpenGL ES 应用的开发人员而言,另一个可使用的重要工具是英特尔图形性能分析器(英特尔 GPA)。该工具套件支持用户实时查看数十个关键系统指标,包括 CPU、GPU 和 OpenGL ES。英特尔 GPA 可在 Windows 或 Ubuntu Linux 开发系统上运行,并可通过 Android 调试接口(adb)与目标 Android 设备上的驱动程序组件进行通信 通过做一些实验,开发人员能够快速从视觉上看到图形管线中的瓶颈,并找到优化代码的最佳机遇。

更多信息以及下载面向 Android 开发的最新版英特尔 GPA(2012 R4),请参见: http://software.intel.com/zh-cn/vcsource/tools/intel-gpa?cid=sem121p7972

4. 从何处获取 OpenGL ES 驱动程序

获取面向 Android 的英特尔凌动处理器的 OpenGL ES 驱动程序非常简单。当你下载支持英特尔凌动处理器的 Android SDK 时,它们已经集成至 x86 系统映像。英特尔与谷歌开发人员合作,让在 x86 设备上开发 Android 应用与在 ARM 设备上一样轻松 — 即使您的应用大量使用了 OpenGL ES。

Android 2.3.3 (Gingerbread)、4.0.3 (Ice Cream Sandwich)和 4.1 版(Jelly Bean) 可为英特尔凌动处理器的内建提供全面的支持,包括 OpenGL ES 1.1 和 2.0 驱动程序。仅需从 Android SDK 管理器中选择上述版本中的一个。确保您选择的版本在已包括在“英特尔 x86 凌动系统映像”列表中。此外,还需确保下载并安装英特尔硬件加速执行管理器(英特尔 HAXM),它位于 “Extras” 下的 SDK 管理器中。如果您尚未安装 Android SDK 管理器,可从下列网站进行下载: http://developer.android.com/sdk/index.html

或者,您也可以直接从英特尔网站上下载英特尔 x86 系统映像: https://software.intel.com/zh-cn/articles/android-404-ice-cream-sandwich-x86-emulator-system-image

5. PowerVR* GPU

英特尔凌动处理器采用 PowerVR 图形加速器,它是当前移动设备上使用最普遍的 OpenGL ES 加速器。PowerVR 构建在通用可扩展渲染引擎(USSE)架构上,是一种业经验证的成熟设计。然而,并非所有 PowerVR 内核的构建方式都一样。SGX540 系列的 USSE 数量是 SGX530 内核的两倍,SGX544MP2 内核是其四倍,因此性能也分别将是两倍或四倍(如果时钟速率相同)。但是,英特尔凌动处理器比其他实施采用的时钟速率更高,因此能够为 OpenGL ES 提供更高的性能,最终可提供更为流畅的用户体验。表 2 总结了基于英特尔凌动处理器的 PowerVR 核心家族。

英特尔® 凌动™ 系列 GPU 核心 GPU 时钟
英特尔® 凌动™ Z24XX PowerVR SGX 540 400 MHz
英特尔® 凌动™ Z2580 PowerVR SGX 544MP2 TBA

表 2: 面向 Android* 的英特尔® 凌动™ 处理器中的 OpenGL ES* 加速器

实际上,PowerVR 中的 USSE 架构能够满足 OpenGL 2.1 和 DirectX* 10.1 的统一着色器模型要求,但是只有 OpenGL ES 1.1 和 OpenGL ES 2.0 及其扩展曝露的特性 Android 开发人员才可使用。

6. OpenGL ES 扩展

根据定义 OpenGL ES 1.1 和 2.0 的 Khronos 标准文档,在不同的平台上所使用的 OpenGL ES 功能集应相同。这就是创建标准化 API 的目的。但是,GPU 开发人员可通过扩展的形式将其 GPU 的特殊特性传输至 OpenGL ES。Khronos 维护 OpenGL ES 扩展的官方在线注册表,所有扩展信息均记录在: http://www.khronos.org/registry/gles

最重要的 OpenGL ES 扩展可在大部分的 Android 平台上使用,如压缩纹理和直接纹理传输支持,但是 OpenGL ES 目前在使用的压缩纹理有许多不同的格式。英特尔凌动处理器中的 PowerVR 核心可为各种压缩纹理格式提供支持。

压缩纹理是一项面向 3D 应用的重要技术,有助于降低内存要求和提高性能,但是正在使用的各种平台仅通过扩展定义,因此在每个平台上都各有差别。使用最广泛的是 Ericsson Texture Compression (ETC1_RGB8),但是它仅支持每像素 8 位的精度,而且不支持每像素 alpha。 除了 ETC1_RGB8 之外,PowerVR GPU 还支持 PVRTC 格式,相比 ETC1_RGB8,PVRTC 有一些重要的优势。PVRTC 格式支持每像素 2 位或 4 位精度的压缩纹理,并带有可选的每像素 alpha 信息。这些功能可通过 ETC1_RGB8 格式显著降低纹理尺寸,并可更灵活地创建 alpha 值混合效果。

此外,PowerVR 核心和 PVRTC 也用于各代的 Apple iPhone*、iPod* Touch 和 iPad* 设备,因此,它还在基本 OpenGL ES 标准之外,提供了英特尔凌动处理器 Android 的兼容性,这在开发跨 Android 和 iOS 平台的应用时非常重要。更多信息,请参见“纹理压缩支持”:

http://developer.android.com/guide/topics/graphics/opengl.html

其他的重要 OpenGL ES 扩展可支持在 OpenGL ES 和其他 Android 系统的组件之间快速传输纹理映像,如从 OpenMAX* 传输的视频帧。面向 OpenGL ES 的英特尔凌动处理器驱动程序也支持这些重要的扩展。

Android 应用不应假定任何特定 OpenGL ES 适用于任何特定设备。运行良好的应用应向 OpenGL ES 查询运行时可用扩展的列表。扩展列表可使用下列调用从 OpenGL ES 和 EGL 驱动程序获取:

	glGetString(GL_EXTENSIONS);
	eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS);
	
Google play 网站上有一款适用的应用,可运行该查询并显示任何一台运行该应用的 Android 设备的返回列表:https://play.google.com/store/apps/details?id=com.realtechvr.glview

可在 Android 上使用的 OpenGL ES 扩展有很大的差别,原因在于 GPU 内核,而非 CPU 架构的差别。英特尔凌动处理器提供的 OpenGL ES 与其他采用 PowerVR GPU 的 Android 平台基本相同,虽然英特尔凌动处理器采用 x86 CPU 架构。事实上,相比其他大部分的 GPU,英特尔凌动处理器上的 PowerVR 核心可提供更多专用的 OpenGL ES 扩展,而且其中一些扩展非常有帮助。当然,使用这些专用的扩展将会限制您的应用向采用 PowerVR 核心的 Android 设备移植。名称以“IMG”结尾的扩展可能是 PowerVR 专用的,但这也不是绝对的。您最好使用诸如 GLView 的工具对一些 Android 设备亲自进行测试,以了解您所需的扩展是否存在。

以下是 PowerVR 专用的 OpenGL ES 扩展的示例

		glFramebufferTexture2DMultisampleIMG()
		glRenderbufferStorageMultisampleIMG()
		glMultiDrawArraysEXT()
		glMultiDrawElementsEXT()
	
7. 浮点性能

CPU 和 GPU 核心为 OpenGL ES 应用能否提供快速浮点性能对于是否能够运行良好至关重要。着色器程序大量使用浮点,这是在 GPU 上执行;一般而言,OpenGL ES 应用代码也需要大量的浮点计算,而这必须在 CPU 上执行并能够调用至 OpenGL ES。这是英特尔凌动处理器明显优于基于 ARM 的解决方案的另一方面,因为英特尔凌动处理器在 CPU 和 GPU 核心上都能够快速执行浮点计算。

不具备浮点硬件的系统将为 OpenGL ES 1.1 使用定点计算,而非不同的驱动程序,这种系统称 “Common-Lite”。但是,英特尔为 Android 提供的系统映像仅包括适用于 OpenGL ES 1.1 的 “Common”(浮点)驱动程序,因为所有的英特尔凌动处理器的 CPU 和 GPU 核心中都内建了硬件浮点,因此,便无需使用任何定点。适用于 OpenGL ES 2.0 的 Khronos 标准仅可管理浮点。

8. Android 框架 SDK

Android SDK 采用 GLSurfaceView 类,可为您提供最轻松的方式在 Android 应用中使用 OpenGL ES。该类可以处理大部分的 EGL 初始化、线程,并能够分配供 OpenGL ES 渲染以及 Android 显示的接口。此外,OpenGL ES 还可渲染至具备其他功能(如转换和 alpha 值混合)的 TextureView 对象,但是需要设置和使用更多代码。Android SDK 还可通过以下谷歌和 Khronos 提供的软件包中的 Java* 绑定为 OpenGL ES 提供支持:

  • jvax.microedition.khronos.egl: The Khronos standard implementation
  • javax.microedition.khronos.opengles: The Khronos standard implementation
  • android.opengl: Updated to provide better performance

以下三个版本的 OpenGL ES API 可在今天的 Android 上使用:1.0、1.1 和 2.0。OpenGL ES 1.0 已替换为 1.1。 OpenGL ES 2.0 通过着色器编程可提供更大的灵活性,但是无法与面向 OpenGL ES 1.1 编写的传统代码兼容。表 3 总结了可用于应用开发的 OpenGL ES API 版本以及面向 Android 为其进行定义的类。

OpenGL ES API 版本 类 OpenGL ES 1.0 android.opengl.GLES10 OpenGL ES 1.0 android.opengl.GLES10Ext OpenGL ES 1.1 android.opengl.GLES11 OpenGL ES 1.0 android.opengl.GLES11Ext OpenGL ES 2.0 android.opengl.GLES20

表 3: Android 中的 OpenGL ES 支持类

面向 Android 的英特尔凌动处理器平台为通过 SDK 或 NDK 使用任何版本的 OpenGL ES 的应用提供全面的支持。

9. Android SDK

原生开发套件(NDK)由谷歌开发,旨在通过绕过 Dalvik VM 并在本地运行 C/C++ 代码来帮助开发人员在其 Android 应用中达到更高的性能。谷歌决定将 NDK 向所有 Android 开发人员开放,因为它能够简化在 C/C++ 中编写的应用的移植流程,并支持在性能需求最高处(如 3D 游戏)提供最佳的性能。

Android NDK 可支持 OpenGL ES 1.1 和 2.0,并可为其提供一些示例应用。大部分使用 OpenGL ES 的应用使用 C/C++ 进行编写,NDK 可提供一种能够将 C/C++ 代码与 Android 框架结合起来的机制,该机制基于 Java 。这称为 Java 原生接口(JNI),它现在正成为在 Android 上实施需要快速图形的应用的主要方法。自 r6b 版本起,NDK 开始支持面向英特尔凌动处理器的 JNI,您可通过以下网站下载: http://developer.android.com/sdk/ndk/index.html

10. Renderscript

Renderscript 首次推出是在 Android 3.0 中。这是谷歌开发的又一项技术,旨在通过绕过 Dalvik VM 帮助加速计算密集型算法,包括图形。但是,与 NDK 不同,Renderscript 代码是在 Android 设备上运行时编译的。Renderscript 旨在开发多个处理器,但是目前它仅支持在 CPU 上使用的处理内核,而不支持 GPU 上的。谷歌准备在未来版本中对 Renderscript 进行改进以利用 GPU 内核,当实现时,现有的 Renderscript 需要能够开发该新能力;希望不会出现修改。

Renderscript 可提取运行它的硬件,这样,应用开发人员则无需考虑 CPU 架构或实际可用的处理器数量。但是,Renderscript 无法使用现有的并行计算标准来完成它,如 GLSL 或 OpenCL*。它是通过一种新语言来完成的,该语言基于 C99 并包括内置 OpenGL ES 支持。Renderscript 的提取功能可确保它可在任意 Android 设备上使用,包括英特尔凌动处理器。关于 Renderscript 的更多信息,请参见: http://android-developers.blogspot.com/2011/02/introducing-renderscript.html

11. 结论

英特尔凌动处理器的 x86 架构在开发面向 Android 的 OpenGL ES 应用时并无任何困难,因为该处理器可提供基于 ARM 的解决方案能够提供的所有功能,甚至更多。在确保 OpenGL ES 在不同 Android 平台上的兼容性时,GPU 架构更重要;英特尔凌动处理器的 PowerVR 内核是当下使用最广泛的 GPU。英特尔凌动处理器结合了采用快速浮点的一流 PowerVR 核心以及可提供快速 AVD 模拟和图形管线性能分析的卓越支持软件,可为面向 Android 的 OpenGL ES 应用提供最佳的整体解决方案。

12. 关于作者

Clay D. Montgomery 是嵌入式系统 OpenGL 驱动程序和应用领域首屈一指的开发人员。他曾在 STB Systems、VLSI Technology、Philips Semiconductors、Nokia、Texas Instruments、AMX 等公司担任过图形加速器硬件、图形驱动程序、API 和跨多平台 OpenGL 应用的设计师,也曾担任过独立咨询师。他曾参与开发第一代面向 Freescale i.MX 和 TI OMAP 平台的 OpenGL ES、OpenVG 和 SVG 驱动程序和应用,以及 Vivante、AMD 和 PowerVR 核心。他曾在嵌入式 Linux 上开发过 OpenGL * ES 并开办过关于该内容的研讨会,并曾代理过 Khronos Group 的多家公司。

OpenGL ES、OpenMAX 和 OpenVG 是 Khronos Group 的商标。

OpenCL 和 OpenCL 标识是苹果公司的商标,需获得 Khronos 的许可方能使用。

DirectX 是微软公司的商标。

版权所有, 2012 年 12 月 25 日,英特尔公司。