Intel Learning Series para desarrolladores para Android*, n.º 11: Compatibilidad, rendimiento y características de OpenGL ES* para Android* en el procesador Intel® Atom™

1. Introducción

La API estándar para gráficos 3D en Android es OpenGL ES, que es la API para gráficos tridimensionales más usada en teléfonos móviles en la actualidad. Android usa OpenGL ES para acelerar tanto los gráficos 2D como los 3D. En las primeras versiones de Android, se podría decir que la aceleración OpenGL ES era opcional, pero con la evolución de Android y el aumento de tamaño de las pantallas, OpenGL ES acelerado se ha convertido en una parte esencial del sistema de gráficos de Android.

Las tres versiones de OpenGL ES son la 1.0 y la 1.1, que han sido admitidas en Android desde el comienzo, y la 2.0, que se agregó en Android 2.2. Ahora, los desarrolladores para Android pueden elegir cualquier versión. En la Tabla 1 se muestra un resumen de las versiones principales de Android hasta la fecha y cuáles tienen imágenes de sistema integradas para el procesador Intel® Atom™.

Versión Nombre API Admite Compatibilidad con Intel® Atom™
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, 2.0  
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

Tabla 1: Resumen de las versiones de Android* con OpenGL ES* integrado e imágenes de sistema para procesadores Intel® Atom™

La plataforma Intel Atom ha sido compatible con Android desde Android 2.3.3, incluido OpenGL ES 1.0, 1.1 y 2.0. La compatibilidad de OpenGL ES con los procesadores Intel Atom es total y supera a la mayoría de las soluciones de Android debido a una combinación de prestaciones sin igual:

  • GPU PowerVR SGX540 y SGX544MP2 (a 400 MHz y más)
  • Punto flotante más rápido
  • Imágenes de sistema x86 para emulación por dispositivo virtual de Android
  • Supervisor de Ejecución Acelerada por Hardware Intel® (Intel HAXM)
  • Analizadores de Rendimiento de Gráficos Intel® (Intel GPA)

Intel se ha asociado con Google y su compromiso es continuar ofreciendo una compatibilidad excepcional con la plataforma Android con versiones en curso de imágenes de sistema x86, Intel HAXM e Intel GPA para futuras versiones de Android.

2. Imágenes de sistema x86 para emulación por dispositivo virtual de Android

Todo desarrollador de software integrado sabe cómo un emulador de dispositivo virtual puede acelerar el desarrollo de nuevas aplicaciones. Pero usar un dispositivo virtual de Android (AVD) para una imagen de sistema ARM es terriblemente lento porque el AVD debe emular cada una de las instrucciones de ARM en un sistema de desarrollo Windows* o Linux*. Puede llevar 5 minutos o más el sólo iniciar Android en un AVD ARM típico. Intel ha resuelto este problema con el Supervisor de Ejecución Acelerada por Hardware Intel (Intel HAXM). Cuando se instala esta herramienta y se la usa con un AVD con imagen de sistema Intel x86 Atom, el desarrollo de las aplicaciones se acelera notablemente y ni siquiera es necesario tener hardware Intel Atom.

La emulación de AVD de Google sólo admite actualmente desarrollar OpenGL ES 1.0 y 1.1, no 2.0. Esta es una limitación del software de emulación de Google independiente de la arquitectura de la CPU o la GPU.

3. Analizadores de Rendimiento de Gráficos Intel®

Otra herramienta importante para los desarrolladores de aplicaciones OpenGL ES con destino Android en procesadores Intel Atom son los Analizadores de Rendimiento de Gráficos (Intel GPA). Este conjunto de herramientas permite ver en tiempo real docenas de métricas de sistema cruciales sobre la CPU, la GPU y OpenGL ES. Los Analizadores de Rendimiento de Gráficos Intel se pueden ejecutar en sistemas de desarrollo Windows o Linux Ubuntu y comunicarse con componentes de controladores que se ejecutan en el dispositivo de destino Android por medio de la interfaz de depuración Android (adb). Con sólo hacer unos experimentos, los desarrolladores pueden detectar, rápidamente y en forma visual, cuellos de botella en el pipeline de gráficos e identificar las mejores oportunidades de optimización del código.

Para obtener más información y descargar la versión más reciente de Intel GPA (2012 R4) para desarrolladores Android, vaya a: http://software.intel.com/es-es/vcsource/tools/intel-gpa?cid=sem121p7972

4. Dónde obtener los controladores de OpenGL ES

Obtener controladores de OpenGL ES para los procesadores Intel Atom es fácil cuando se desarrolla para Android. Ya están integrados en las imágenes de sistema x86 cuando se descarga un SDK de Android compatible con procesadores Intel Atom. Los desarrolladores de Intel y Google han trabajado codo a codo para que el desarrollo de aplicaciones Android sea igual de sencillo para dispositivos x86 como para dispositivos ARM, aunque la aplicación haga un uso considerable de OpenGL ES.

Las versiones de Android 2.3.3 (Gingerbread), 4.0.3 (Ice Cream Sandwich) y 4.1 (Jelly Bean) tienen compatibilidad integrada con los procesadores Intel Atom, incluidos los controladores para OpenGL ES 1.1 y 2.0. Simplemente hay que seleccionar una de estas versiones desde el Android SDK Manager. Es importante asegurarse de que la versión seleccionada indique que incluye “Intel x86 Atom System Image”, la imagen de sistema. Tampoco hay que olvidarse de descargar e instalar el Supervisor de Ejecución Acelerada por Hardware Intel (Intel HAXM), que figura en “Extras” en el SDK Manager. Si todavía no tiene instalado el Android SDK Manager, puede descargarlo desde http://developer.android.com/sdk/index.html

Una alternativa es descargar las imágenes de sistema Intel x86 directamente del sitio de Intel: http://software.intel.com/es-es/articles/android-ice-cream-sandwich-x86-emulator-image

5. La GPU PowerVR*

Los procesadores Intel Atom cuentan con aceleradores de gráficos PowerVR, que son los aceleradores OpenGL ES más usados en dispositivos móviles en la actualidad. PowerVR es una línea madura y de eficacia comprobada en la arquitectura Universal Scalable Shader Engine (USSE). Pero no todos los núcleos de PowerVR son iguales. La serie SGX540 tiene el doble de USSE que los núcleos SGX530, y el núcleo SGX544MP2 tiene el cuádruple, así que el rendimiento se duplicaría o cuadruplicaría, respectivamente, si las velocidades de reloj fueran las mismas. Sin embargo, los procesadores Intel Atom también tienen velocidades de reloj más altas que otras implementaciones, lo cual proporciona un rendimiento aún mayor para OpenGL ES y, en última instancia, una experiencia más fluida para el usuario. La Tabla 2 presenta un resumen de las familias de núcleos PowerVR que se incluyen en los procesadores Intel Atom.

Serie Intel® Atom™ Núcleo de GPU Reloj de GPU
Intel® Atom™ Z24XX PowerVR SGX 540 400 MHz
Intel® Atom™ Z2580 PowerVR SGX 544MP2 A determ.

Tabla 2: Aceleradores OpenGL ES* en procesadores Intel® Atom™ para Android*

La arquitectura USSE de PowerVR puede en realidad manejar los requisitos del modelo de sombreador unificado de OpenGL 2.1 y DirectX* 10.1, pero sólo las prestaciones expuestas por OpenGL ES 1.1, OpenGL ES 2.0 y sus extensiones están disponibles para los desarrolladores Android.

6. Extensiones de OpenGL ES

Los documentos normativos de Khronos que definen OpenGL ES 1.1 y 2.0 establecen que el conjunto de prestaciones de OpenGL ES debería ser básicamente el mismo en las diferentes plataformas. Esta es la finalidad de que haya una API estandarizada. Sin embargo, a los desarrolladores de GPU se les permite exponer prestaciones especiales de sus GPU mediante extensiones de OpenGL ES. El registro online oficial de extensiones de OpenGL ES que mantiene Khronos, donde están documentadas todas las extensiones, se encuentra en http://www.khronos.org/registry/gles

Las extensiones más importantes de OpenGL ES están disponibles en la mayoría de las plataformas Android, como la compatibilidad con texturas comprimidas y streaming directo de texturas, pero en la actualidad se usan muchos formatos diferentes de texturas comprimidas con OpenGL ES. El núcleo PowerVR de los procesadores Intel Atom ofrece la mayor compatibilidad para los distintos formatos de texturas comprimidas.

La compresión de texturas es una técnica importante para reducir el uso de memoria y mejorar el rendimiento en las aplicaciones 3D, pero los diferentes formatos que se encuentran en uso sólo están definidos por extensiones y, por lo tanto, varían para cada plataforma. El más admitido es Ericsson Texture Compression (ETC1_RGB8), pero permite únicamente una precisión de 8 bits por píxel y no es compatible con alfa por píxel. Además de ETC1_RGB8, la GPU PowerVR también admite los formatos PVRTC, que tienen algunas ventajas importantes respecto de ETC1_RGB8. Los formatos PVRTC son compatibles con texturas de 2 o 4 bits por píxel de precisión y con información opcional de alfa por píxel. Estas prestaciones pueden reducir considerablemente el tamaño de las texturas en el formato ETC1_RGB8 y proporcionar mayor flexibilidad en la creación de efectos con mezcla alfa.

Los núcleos PowerVR y el formato PVRTC también se usan en todas las generaciones de dispositivos iPhone*, iPod* Touch e iPad* de Apple, lo cual brinda cierta compatibilidad con Android en procesadores Intel Atom más allá de la norma OpenGL ES básica; esto es importante cuando se desarrollan aplicaciones tanto para la plataforma Android como para iOS. Se puede encontrar más información en el apartado “Texture compression support” de la página

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

Otras extensiones importantes de OpenGL ES aceleran el streaming de imágenes de texturas entre OpenGL ES y otras partes del sistema Android, como cuadros de video de OpenMAX*, por ejemplo. Los controladores de procesadores Intel Atom para OpenGL ES también admiten estas importantes extensiones.

En las aplicaciones de Android nunca se debe dar por hecho que haya alguna extensión determinada de OpenGL ES en algún dispositivo en particular. En cambio, las aplicaciones con buen comportamiento consultarán a OpenGL ES para obtener una lista de extensiones en el tiempo de ejecución. Estas listas de extensiones se pueden obtener de los controladores de OpenGL ES y EGL con estas llamadas:

1 glGetString(GL_EXTENSIONS);
2 eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS);

Hay una aplicación muy útil en el sitio de Google Play que realiza esta consulta y muestra la lista devuelta para cualquier dispositivo Android. Se la puede encontrar en https://play.google.com/store/apps/details?id=com.realtechvr.glview

Las extensiones de OpenGL ES disponibles para Android varían considerablemente según el núcleo de la GPU, no de acuerdo con las diferencias de arquitectura de la CPU. Los procesadores Intel Atom proporcionan en esencia las mismas extensiones de OpenGL ES que cualquier otra plataforma Android con GPU PowerVR, más allá de que el procesador Intel Atom tenga una arquitectura de CPU x86. De hecho, el núcleo PowerVR de los procesadores Intel Atom admite más extensiones exclusivas de OpenGL ES que la mayoría de las demás GPU, y algunas de ellas son de gran utilidad. Por supuesto que usar estas extensiones exclusivas limita la portabilidad de la aplicación a dispositivos Android con núcleos PowerVR. Las extensiones con nombres que terminan en “IMG” tienen una alta probabilidad de ser exclusivas de PowerVR, pero esta no es una regla absoluta. Lo mejor es probar una serie de dispositivos Android uno mismo para ver si tienen las extensiones que se necesitan para una herramienta como GLView.

Los siguientes son algunos ejemplos de extensiones de OpenGL ES exclusivas para PowerVR

1 glFramebufferTexture2DMultisampleIMG()
2 glRenderbufferStorageMultisampleIMG()
3 glMultiDrawArraysEXT()
4 glMultiDrawElementsEXT()

7. Rendimiento de punto flotante

Es fundamental que los núcleos tanto de la CPU como de la GPU proporcionen un alto rendimiento de punto flotante para que las aplicaciones OpenGL ES funcionen bien. Los programas de sombreado usan mucho punto flotante, que se ejecuta en la GPU, pero normalmente el código de las aplicaciones OpenGL ES también requiere de muchos cálculos de punto flotante, que se deben realizar en la CPU como preparación para llamadas a OpenGL ES. Esta es otra área en la cual los procesadores Intel Atom tienen una clara ventaja sobre las soluciones basadas en ARM, porque ofrecen una rápida ejecución de cálculos de punto flotante tanto en el núcleo de la CPU como en el de la GPU.

Los sistemas que no tienen hardware de punto flotante usan matemática de punto fijo con un control aparte para OpenGL ES 1.1 llamado “Common-Lite”. Pero las imágenes de sistema que proporciona Intel para Android incluyen sólo el controlador “Common” (de punto flotante) para OpenGL ES 1.1, debido a que todos los procesadores Intel Atom tienen hardware de punto flotante integrado en los núcleos de la CPU y de la GPU, así que no hay necesidad de usar punto fijo. La norma de Khronos para OpenGL ES 2.0 determina el uso de punto flotante solamente.

8. El SDK de marco de trabajo de Android

El SDK de Android ofrece la manera más fácil de usar OpenGL ES en su aplicación Android mediante el empleo de la clase GLSurfaceView. Esta clase controla la mayor parte de la inicialización de la interfaz EGL, y el subprocesamiento y la asignación de superficies que OpenGL ES puede representar y Android puede mostrar. OpenGL ES también puede tener como destino de representación un objeto de TextureView con funcionalidades adicionales, como transformaciones y mezcla alfa, pero se requiere más código para configurarlo y usarlo. El SDK de Android brinda compatibilidad con OpenGL ES mediante enlaces para Java* en estos paquetes de Google y Khronos:

  • jvax.microedition.khronos.egl: la implementación estándar de Khronos
  • javax.microedition.khronos.opengles: la implementación estándar de Khronos
  • android.opengl: actualizada para proporcionar mejor rendimiento

Las tres versiones de la API de OpenGL ES que se pueden usar en Android son: 1.0, 1.1 y 2.0. OpenGL ES 1.0 ha sido reemplazado por 1.1. OpenGL ES 2.0 ofrece mayor flexibilidad mediante programación de sombreador, pero no es compatible con código heredado escrito para OpenGL ES 1.1. En la Tabla 3 se presenta un resumen de versiones de la API de OpenGL ES que se pueden usar para desarrollar aplicaciones y las clases que las definen para Android.

Versión de API de OpenGL ES Clases
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

Tabla 3: Clases de compatibilidad con OpenGL ES en Android

La plataforma de procesadores Intel Atom para Android proporciona compatibilidad total para aplicaciones que usen cualquiera de estas versiones para OpenGL ES mediante el SDK o el NDK.

9. El NDK de Android

Google creó el kit de desarrollo nativo (Native Development Kit, NDK) para ayudar a que los desarrolladores lograran mejores rendimientos en sus aplicaciones Android; la idea era que se omitiera la máquina virtual Dalvik y se ejecutara código C/C++ en forma nativa. Google decidió que el NDK estuviera disponible para todos los desarrolladores Android porque simplifica el proceso de portación de aplicaciones existentes escritas en C/C++ y permite lograr el mejor rendimiento posible en las aplicaciones que más lo necesitan, como los juegos 3D.

El NDK de Android admite tanto OpenGL ES 1.1 como 2.0 e incluye algunas aplicaciones de ejemplo para ambas versiones. La mayoría de las aplicaciones que usan OpenGL ES están escritas en C/C++; el NDK aporta un mecanismo para combinar el código C/C++ con un marco de trabajo de Android, que está basado en Java. A esto se lo llama Interfaz Nativa Java (Java Native Interface, JNI) y se está convirtiendo en el método predominante para implementar aplicaciones que requieren alta velocidad de gráficos en Android. El NDK es compatible con JNI para los procesadores Intel Atom a partir de la versión r6b, que se puede descargar de http://developer.android.com/sdk/ndk/index.html

10. Renderscript

Renderscript apareció por primera vez en Android 3.0. Es otra tecnología que desarrolló Google para acelerar algoritmos que requieren mucho cálculo, incluidos los gráficos, mediante la omisión de la máquina virtual Dalvik. Pero, a diferencia del NDK, el código de Renderscript se compila en el tiempo de ejecución en el dispositivo Android. Renderscript está diseñada para aprovechar múltiples procesadores, pero actualmente sólo utiliza los núcleos de procesamiento disponibles en la CPU y no los de la GPU. Es probable que Google perfeccione Renderscript para que utilice núcleos de GPU en alguna versión futura. El código existente de Renderscript debería poder aprovechar esa nueva posibilidad cuando esté disponible, esperamos que sin modificaciones.

Renderscript se abstrae del hardware sobre el cual se ejecuta para que los desarrolladores de aplicaciones no tengan que preocuparse de la arquitectura de la CPU ni de cuántos núcleos disponibles hay. Pero Renderscript no usa estándares informáticos paralelos existentes para cumplir con su cometido, como lo hacen GLSL u OpenCL*. Es en cambio un nuevo lenguaje basado en C99 con compatibilidad integrada para OpenGL ES. La abstracción respecto del hardware garantiza que funcione en cualquier dispositivo Android, incluidos los procesadores Intel Atom. Para obtener más información acerca de Renderscript, consulte la página http://android-developers.blogspot.com/2011/02/introducing-renderscript.html

11. Conclusión

La arquitectura x86 de los procesadores Intel Atom no constituye un inconveniente cuando se desarrollan aplicaciones OpenGL ES para Android, porque el procesador proporciona todas las prestaciones que los desarrolladores esperan encontrar en las soluciones basadas en ARM, y muchas más. La arquitectura de la GPU es mucho más importante para garantizar la compatibilidad de OpenGL ES en las diferentes plataformas Android; el núcleo PowerVR de los procesadores Intel Atom es la GPU más usada en dispositivos móviles hoy en día. La combinación que ofrecen los procesadores Intel Atom, es decir, núcleos PowerVR (que son los mejores de su clase), gran velocidad de cálculo de punto flotante y software de gran compatibilidad para una rápida emulación de AVD y un veloz análisis de rendimiento de pipelines de gráficos, constituye la mejor solución general para aplicaciones OpenGL ES en Android.

12. Acerca del autor

Clay D. Montgomery es un desarrollador de primer nivel de controladores y aplicaciones para OpenGL en sistemas integrados. Su experiencia es basta e incluye el diseño de hardware acelerador de gráficos, controladores de gráficos, API y aplicaciones OpenGL para muchas plataformas en STB Systems, VLSI Technology, Philips Semiconductors, Nokia, Texas Instruments, AMX y también como consultor independiente. Su participación fue fundamental en el desarrollo de algunos de los primeros controladores de OpenGL ES, OpenVG y SVG, y de aplicaciones para las plataformas Freescale i.MX y TI OMAP y los núcleos de gráficos Vivante, AMD y PowerVR. Ha creado talleres sobre desarrollo OpenGL* ES en Linux integrado y representó a varias empresas del Grupo Khronos.

OpenGL ES, OpenMAX y OpenVG son marcas comerciales del Grupo Khronos.

OpenCL y el logotipo de OpenCL son marcas comerciales de Apple Inc y se usan con permiso de Khronos.

DirectX es una marca comercial de Microsoft Corporation.

Per informazioni complete sulle ottimizzazioni del compilatore, consultare l'Avviso sull'ottimizzazione