Buscar
Social
Ofertas laborales ES
« Google vende Motorola a Lenovo por $2,900 millones | Main | Fotos de la charla sobre Java 8 celebrada en Madrid »
viernes
ene312014

Desarrollo y optimización para aplicaciones de juegos Android basados en el NDK en plataformas basadas en la arquitectura Intel®

Nota: Este tutorial ha sido donado a la comunidad de javaHispano por Intel. Intel espera que en el futuro sus procesadores incrementen considerablemente su presencia en los terminales móviles Android, por ello ha creído que este artículo sería interesante para nuestra comunidad. El artículo puede encontrarse en la web de Intel aquí. Podéis encontrar el primer artículo de la serie aquí.

Resumen

El Kit de desarrollo nativo para Android (NDK) es una herramienta que complementa el SDK de Android y permite implementar partes de su aplicación empleando lenguajes de código nativo tales como C y C++.

Descargue el kit de la herramienta NDK de: http://developer.android.com/tools/sdk/ndk/index.html

NDK para el conjunto de instrucciones para la arquitectura de X86

Android es un sistema operativo de código abierto desarrollado por Google. En la actualidad, Android se ejecuta en tres familias de conjuntos de instrucciones de las arquitecturas: ARM, x86 y MIPS. X86 se refiere a una familia de conjuntos de instrucciones de arquitecturas basada en la CPU de Intel 8086, presentada en el año 1978. Vamos a describir las diferencias entre X86 (también denominada arquitectura Intel®) y los otros chipsets en los que se ejecuta Android desde la perspectiva de una aplicación.

Las aplicaciones Android se pueden clasificar en dos tipos:

  • Las aplicaciones Dalvik que incluyen el código Java* y solo utilizan la API y los archivos de recursos necesarios oficiales del SDK para Android, tales como .xml y .png, compilados en un archivo APK.
  • Las aplicaciones NDK para Android que incluyen código Java y los archivos de recursos así como código fuente en C/C++ y, algunas veces, en código ensamblador. Todos los códigos nativos se compilan en una biblioteca vinculada dinámica (un archivo .so) y, posteriormente, Java la llama en el programa principal mediante un mecanismo de JNI.

Motor de juegos para Android

El motor de juegos es un módulo clave para las aplicaciones de juegos. Existen varios motores que se ejecutan en Android, incluyendo los motores 2D y 3D que son motores de código abierto y comercial. Por tanto, es difícil migrar y desarrollar juegos basados en Android para que se ejecuten en la plataforma de la arquitectura Intel. Cocos2d-x y Unity 3D son los motores de juegos más populares para las plataformas Android.

Cocos2d-x se basa en Cocos2d-iPhone y consiste de plataformas ampliables y compatibles, con varios lenguajes de programación que comparten la misma estructura de API. Desde que lo presentaron en julio de 2010, cocos2d-x ha sido descargado más de 500 millones de veces. Los gigantes en la industria de los juegos para dispositivos móviles tales como Zynga, Glu, GREE, DeNA, Konami, TinyCo, Gamevil, HandyGames, Renren Games, 4399, HappyElements, SDO y Kingsoft utilizan cocos2d-x.

Unity 3D es un motor de juegos multiplataforma con un IDE incorporado que fue desarrollador por Unity Technologies. Sirve para desarrollar videojuegos para complementos web, plataformas de escritorio, consolas y dispositivos móviles. Además, más de un millón de programadores lo utiliza. Comenzó en 2005 como una herramienta para desarrollar juegos compatible con OS X para convertirse en un motor de juegos multiplataforma. La actualización más reciente, Unity 4.1, fue lanzada al mercado en marzo de 2013. En la actualidad, es compatible con desarrollo para iOS, Android, Windows, Blackberry 10, OS X, Linux, navegadores de web, Flash*, PlayStation 3, Xbox 360, Windows Phone y Wii.

Desarrollo de juegos basados en el NDK para Android en plataformas de la arquitectura Intel

Antes de describir el desarrollo de juegos, nos gustaría mencionar algunos temas generales sobre la plataforma Android. Como bien sabe, los juegos vienen en muchos estilos diferentes. Diferentes estilos de juegos necesitan distintos principios de diseño. Al principio de un proyecto, generalmente se decide el género del juego. A menos que usted imagine algo completamente nuevo y nunca antes visto, es muy probable que la idea de su juego encuadre en uno de los amplios géneros populares actuales. La mayoría de los géneros han establecido estándares de la mecánica de los juegos (por ej. esquemas de control, metas específicas, etc.). Desviarse de estos estándares puede convertir un juego en un éxito rotundo, ya que los jugadores anhelan algo nuevo. Algunos de los géneros comunes son:

  • Arcade y acción
  • Juegos mentales y rompecabezas
  • Cartas y casino
  • Casuales
  • Tapiz interactivo
  • Carreras
  • Juegos deportivos
  • Widgets
  • etc.

El proceso para desarrollar juegos generales para Android es similar a cualquier otra aplicación para Android. Primero, descargue el SDK y NDK para Android del sitio web de Google e instálelos de manera correcta.

Asumo que usted ha completado todas las instalaciones y los pasos de preparación. Usando el motor de juegos Cocos2d-x como el ejemplo, veamos cómo crear un juego para la arquitectura Intel.

Descarga de Cocos2D-x

Descargue la versión estable más reciente de Cocos2D-x del sitio web: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Download

Ejecución del lote

Ejecute el lote desde Windows Explorer. Cuando le pregunte la ubicación del proyecto, escriba algo como: com.suproyecto.algo, y seleccione el nombre del proyecto y su identificador de destino. Esto creará una carpeta con el nombre del proyecto dentro de la carpeta de instalación de cocos2dx. Debe ver la ejecución de una secuencia de comandos, sin ningún error, parecida a la siguiente:

Establecimiento de las variables de entorno de NDK_ROOT

Agregue la siguiente variable de entorno al final del archivo: home\<sunombre>\.bash_profile (en este caso: c:\cygwin\home\user\.bash_profile):

NDK_ROOT=/cygdrive/<sunombre>/

export NDK_ROOT
 

reinicie cygwin, escriba cd $NDK_ROOT, y debería ver esta pantalla:

Ejecución del archivo build_native.sh

La configuración predeterminada es ARM; necesitamos cambiarla para que se compile para x86. Abra el archivo \helloworld\proj.android \build_native.sh, busque el comando ndk-build y añada el parámetro APP_ABI=x86 al final del comando. Ejecútelo en Cygwin y verá lo siguiente:

Importación del proyecto en Eclipse

Ahora vaya a Eclipse, cree un nuevo proyecto -> Import from existing project (Importar del proyecto existente).

Creación y ejecución

En este paso, Eclipse tendrá algunos problemas:

The import org.cocos2dx.lib cannot be resolved HelloWorld.java

/HelloWorld/src/com/young40/test line 26 Java Problem Cocos2dxActivity cannot be resolved to a type HelloWorld.java

/HelloWorld/src/com/young40/test line 30 Java Problem Cocos2dxActivity cannot be resolved to a type HelloWorld.java

/HelloWorld/src/com/young40/test line 33 Java Problem

Es necesario importar la siguiente biblioteca en Eclipse como un proyecto:

cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/android/java

Vaya a Project (Proyecto) -> Build, and then Run As (Crear y luego ejecutar como) -> Android Application (Aplicación para Andriod):

A continuación se creará un framework de juego para el motor de juego cocos2dx. A este proyecto puede agregar recursos de lógica, sonido, imágenes de juego, etc. para que sea un juego completo.

Optimización de juegos basados en el NDK para Android en plataformas de la arquitectura Intel

Intel® System Studio es un conjunto de herramientas para el perfilado y optimización de aplicaciones en plataformas Android. Por supuesto, podemos usarlo para optimizar juegos. Intel System Studioincluye:

  • Compilador C++ Intel®
  • Intel® Graphics Performance Analyzers
  • Amplificador Intel® VTune™
  • (Intel® JTAG Debugger)

Aquí no explicaremos los detalles de cada herramienta. En lugar de ello, le guiaremos por un ejemplo que muestra cómo funcionan las herramientas Intel.

Primero, usemos una aplicación denominada Bounding Ball que ejecutaremos en un procesador Intel® Atom™ Z2460 (nombre de código Medfield). El juego tiene más de 800 esferas que se mueven a velocidades al azar y chocan entre ellas sin ninguna regularidad. Podemos ver que el rendimiento es deficiente al medir el FPS, el cual es solamente 6 sin ninguna optimización.

Podemos utilizar Intel® Graphics Performance Analyzers (Intel® GPA) para ubicar cuál de los módulos es el cuello de botella y descubrir si está relacionado con la CPU o la GPU.

La captura de pantalla de Intel® Graphics Performance Analyzers a continuación muestra un diagrama que describe los detalles de esta aplicación mediante el GPA en la plataforma Android. En ella, puede ver que la CPU consumió 52.5% de los recursos. Se trata de un porcentaje bastante elevado para una aplicación. Mientras tanto la Carga de ISP, Carga de TA, Carga de TSP y Carga total de USSE en ejecución en la GPU son inferiores al 10%, lo cual significa que la carga de la GPU es normal. Por tanto podemos concluir que el cuello de botella se encuentra en el módulo de la CPU. Para analizar más a fondo el problema del cuello de botella de la CPU, necesitamos describir el código usando el analizador VTune™.

Aquí, no podemos describir la manera de utilizar el analizador VTune, solo explicaremos los resultados obtenidos durante su ejecución. Las áreas problemáticas son las funciones sin y cos dentro de libm.so. De manera que la pregunta es: ¿por qué la aplicación demora tanto tiempo y gasta tantos ciclos de la CPU para ejecutar estas dos funciones?

Al revisar el código de fuente de la aplicación, descubrimos que estas dos funciones problemáticas se llaman cada vez que OpenGL ES* presenta una esfera. Como la geometría de todas las esferas es la misma, solamente el tamaño es distinto. Podemos duplicar esferas usando la función glScale de OpenGL para que esa función de problemática disminuya drásticamente.

Después de la optimización del código, el rendimiento mejora un 80% y el FPS es 14. Asimismo, podemos compilar la aplicación con el Compilador C/C++ Intel para lograr un mejor rendimiento en las plataformas de la arquitectura Intel. El Compilador C/C++ Intel tiene muchos indicadores sobre la optimización del rendimiento en plataformas de la arquitectura Intel. Aquí presentaremos solo algunos de ellos.

  • SSSE3_ATOM
    Supplemental Streaming SIMD Extensions 3 (SSSE3 o SSE3S) es un conjunto de instrucciones SIMD creado por Intel y es la cuarta iteración de la tecnología SSE.
  • IPO
    El indicador Interprocedural Optimization (Optimización entre procesos) reducirá la sobrecarga de llamadas de funciones, eliminará el código no utilizado y volverá a ordenar la propagación y procesos constantes.
  • PGO
    El indicador Profile-Guided Optimizations (Optimizaciones guiadas por el perfil) analizará muchas preguntas abiertas para el optimizador tales como:
    • Cuán a menudo es x > y
    • De qué tamaño es el conteo
    • Qué código es tocado y cuán a menudo

Además, el Compilador C/C++ Intel también puede mejorar las aplicaciones como se indica a continuación:

  • Predicción de ramas más precisa
  • Movimiento de bloque básico para mejorar el comportamiento de la memoria caché de instrucciones
  • Mejor decisión de funciones para inline (IPO de ayuda)
  • Mejor optimización de orden de funciones
  • Optimización de declaraciones de control
  • Mejores decisiones de vectorización

Uso de distintos compiladores y distintos parámetros de compilación, una aplicación puede lograr un rendimiento diferente. Aquí se muestra una comparación del rendimiento de dos compiladores GCC e ICC. La misma aplicación Bounding Ball se está ejecutando en un teléfono Android basado en Intel Medfield. La zona azul ilustra el rendimiento de GCC y la zona roja muestra el de ICC. El punto de referencia (Base Line) es compilar sin ningún parámetro. La segunda parte del diagrama es compilar con arch=atom. La tercera parte es recompilar con todos los parámetros mencionados. Finalmente, puede ver que el rendimiento de la aplicación compilada por ICC es un 60% superior que por GCC.

Resumen

Esta es una breve introducción al desarrollo y optimización de juegos para Android en las plataformas de la arquitectura Intel. Los motores de juegos son la parte principal de todo desarrollo de juegos. Si se ejecutan bien en las plataformas de la arquitectura Intel, entonces los juegos también se ejecutarán bien. Utilizamos el popular motor de juegos cocos2dx, como un ejemplo para demostrar cómo desarrollar en la plataforma de la arquitectura Intel. Intel también ofrece muchas herramientas a los desarrolladores para optimizar sus aplicaciones de juegos en las plataformas Android. Usando Intel System Studio mostramos los pasos para optimizar una aplicación de demostración.

Sobre el autor

Tao Peng es un ingeniero de aplicaciones en el Grupo de software y servicios Intel y se dedica a la habilitación de aplicaciones para móviles, incluyendo el desarrollo y optimización de aplicaciones Android para dispositivos x86, y el desarrollo de aplicaciones con HTML5 para la web.

PrintView Printer Friendly Version

EmailEmail Article to Friend

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>