Ejecutar Modernos Juegos FNA sobre la Plataforma ODROID

FNA (http://fna-xna.github.io/) es una reimplementación de código abierto de XNA. XNA es un entorno de juegos creado por Microsoft Corp., y es bastante popular. Se han escrito excelentes juegos con XNA (solo para MS Windows) y luego se han exportan a Linux y MacOS usando FNA y/o MonoGames.

Entre estos juegos, puedes encontrar algunas joyas como Bastion, FEZ, Stardew Valley, Owlboy y Terraria, por enumerar algunos. Para tener una mejor idea de los juegos que usan este entorno, dirígete a https://goo.gl/4MGnyshttp://www.monogame.net/showcase/

Figura 01 - Stardew Valley

En la actualidad, este entorno es muy interesante para los SBC ODROID, puesto que no está basado en C o C ++, sino en C#. La gran ventaja de los juegos compilados con C# es que pueden ejecutarse en cualquier variante de Linux (cualquier arquitectura de CPU) siempre que soporte y ejecute Mono. Con un poco de trabajo, la mayoría de estos juegos pueden funcionar sin disponer del código fuente del juego en sí. Basta con usar binarios compilados para Linux x86.

Requisitos previos Por supuesto, para lanzar estos juegos, será necesaria una cierta preparación y compilación. Junto con Mono, necesitaremos algunas librerías que dan soporte a los juegos, como SDL2 y también algunas librerías específicas requeridas por los propios juegos. No podemos usarlas aquí debido a la arquitectura ARM del ODROID. También necesitaremos una nueva versión de GL4ES porque todos estos juegos usan extensiones OpenGL 2.1+ como mínimo. Esta guía debería funcionar con la imagen predeterminada de HardKernel o con ODROID GameStation Turbo (OGST). En primer lugar, nos aseguraremos de que todo esté actualizado (no olvide responder "Yes" si solicita una actualización):

$ sudo apt update && sudo apt upgrade
Ahora que está actualizado el sistema, instalaremos las librerías estándar que usaremos. Comenzaremos con SDL2 y las librerías relacionadas:
$ sudo apt install libsdl2-2.0 libsdl2-net-2.0 libsdl2-mixer-2.0 libsdl2-ttf-2.0
Para instalar Mono, ejecuta el siguiente comando:
$ sudo apt install mono-complete mono-xbuild
Una vez realizadas estas instalaciones, estamos casi listos. El problema es que SDL2 puede no estar compilado para soportar OpenGL, y faltas algunas librerías del repositorio que tienen que compilarse a partir de las fuentes. De modo que, simplemente para estar seguros, vamos a instalar algo de material de desarrollo (es posible que ya tenga la mayoría o todo instalado):
$ sudo apt install build-essential git mercurial cmake libgl1-mesa-dev
$ sudo apt install libtheora-dev libvorbis-dev
Si usas OGST y no deseas compilar todas estas librerías, simplemente puedes usar las que compiló @meveric con el siguiente comando:
$ sudo apt install monolibs-odroid
Para el resto que quiera compilar por si mismos los componentes necesarios, prepararse para una compilación bastante contundente.

Compilar algunas librerías Compilaremos algunas librerías y las colocaremos en una carpeta fácil de encontrar, para que podamos dirigir la búsqueda de esas librerías con LD_LIBRARY_PATH, así que vamos a crear esa carpeta, llamada monolibraries en tu directorio de inicio:

$ mkdir ~/monolibs
Ahora, compilaremos las librerías que necesitamos, en concreto: gl4es, SDL2 con soporte OpenGL, mojoshaders y libtheroaplay.

GL4ES Esta librería permite utilizar mucho software/juegos OpenGL 1.x y 2.x bajo el hardware GLES. Es la pieza central de software, junto con Mono, permite que todos estos juegos se puedan ejecutar en ODROID. Las fuentes están en mi cuenta github, así que vamos a coger fuentes más recientes:

$ cd ~
$ git clone https://github.com/ptitSeb/gl4es.git
Una vez que hayas clonado el repositorio, para obtener las últimas fuentes, simplemente dirígete al repositorio y escribe "git pull". Ahora, configura la compilación para ODROID:
$ cd gl4es
$ cmake -DODROID=1  -DCMAKE_BUILD_TYPE=RelWithDebInfo .
y compila las librerías:
$ make -j2
Luego, simplemente cópialas en la carpeta "monolibraries" para usarlas más adelante:

$ cp lib/libGL.so.1 ~/monolibs/

SDL2 Ya tenemos instalado SDL2, pero puede que sea la versión que solo admite GLES y no OpenGL. Entonces seguro que tenemos que compilar una nueva versión. No es tan complicado de todas formas. Usemos la versión que está en mi cuenta de GitHub. Cualquier otra versión debería funcionar, usaremos la mía simplemente por comodidad:

$ cd ~
$ git clone https://github.com/ptitSeb/SDL2.git
Ahora configuraremos la compilación para OpenGL (en esta ocasión haremos una 
compilación fuera de árbol):
$ cd SDL2
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo.
El paso de configuración se ejecutará para un bit. Deberías ver, entre muchas otras cosas: “--VIDEO_OPENGL (Wanted: ON): ON”. Así que ahora, vamos a compilar esta librería (tardará algo más que gl4es):
$ make -j2
Ahora podemos copiar la librería recién compilada al directorio monolibraries:
$ cp libSDL2-2.0.so.0 ~/monolibs/
mojoshaders Esta librería es una de las librerías secundarias creada por Icculus que nos ayuda a exportar el código de Windows a Linux. Esta librería en particular convierte los sombreadores escritos para DirectX en sombreadores GLSL para OpenGL (o Metal). Esta librería es utilizada por FNA para usar trasparentemente los sombreadores DirectX en OpenGL. Obtendremos el código fuente directamente desde el repositorio de Icculus, usando mercurial esta vez:
$ cd ~
$ hg clone http://hg.icculus.org/icculus/mojoshader
Vamos a configurar (para producir una librería compartida, ya que, por defecto, no lo es)
$ cd mojoshader
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED=ON \
-DDEPTH_CLIPPING=ON -DFLIP_VIEWPORT=ON
y creamos la lib:
$ make -j2
Copiaremos también esta librería y pasaremos a la siguiente:
$ cp libmojoshader.so ~/monolibs/
XNAFileDialog

Algunos juegos usan esta librería. Vamos a compilar una versión de la parte nativa por si acaso

$ cd ~
$ git clone https://github.com/flibitijibibo/XNAFileDialog.git
$ cd XNAFileDialog/native
$ make
$ cp libXNAFileDialog.so ~/monolibs/
LibTheoraPlay Algunos juegos usan libtheoraplay para los videos ("A Virus Named TOM" por ejemplo). Esta librería es un poco complicada porque viene en 2 partes: la parte C y la parte C#. La parte C# necesita algunos ajustes para poder ejecutarse en ARM, ya que hay una solución para algunos problemas en Mono/x86 que no aplican en nuestro caso (y corrompen las cosas).
$ cd ~
$ git clone https://github.com/flibitijibibo/TheoraPlay-CS.git
El parche es simple: abre TheoraPlay.cs desde ~/TheoraPlay-CS con tu editor de texto favorito y dirígete a la línea 155. Busca la siguiente línea: /* This is only a problem for Mono. Ignore for Win32 */ if (Environment.OSVersion.Platform != PlatformID.Win32NT && IntPtr.Size == 4) y reemplaza el gran "if" que está dividido en 2 líneas con un simple if ( false )

Ahora, compilaremos la parte C de la librería y la copiaremos en monolibraries:

$ cd TheoraPlay-CS/TheoraPlay
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .
$ make
$ cp libtheoraplay.so ~/monolibs/
Ahora, vamos a compilar la parte C# de la librería (es una DLL de MS Windows) y copiamos el dll en el mismo lugar, para usarlo en el futuro. Podemos ignorar con total seguridad el archivo .dll.config, no lo necesitaremos:
$ cd ..
$ xbuild /p:Configuration=Release 
$ cp bin/Release/TheoraPlay-CS.dll ~/monolibs/
TheoraFile Algunos juegos usan esta librería. Vamos a compilar una versión de la parte nativa por si acaso.
$ cd ~
$ git clone https://github.com/FNA-XNA/Theorafile.git
$ cd Theorafile
$ make
$ cp libtheorafile.so ~/monolibs/
Otras librerías Algunos juegos pueden solicitar otras librerías que son más difíciles de compilar o no son de código abierto. Por ejemplo, Hacknet pedirá libcef (que es básicamente "Chrome en una lib"), o Bastion preguntará por FMODex (que es de código cerrado). Para esos juegos, estás sólo, aunque si encuentra alguna solución funcional, no dudes en dirigirte a los foros ODROID y añade una publicación al respecto. FMOD se puede descargar para ARMHF, pero no parece existir para ARM64 (así que no pude probarlo en mi N1). Para obtener FMOD, debes registrarte en http://www.fmod.com y descarga fmodstudioapi para Linux (obtendrá un archivo similar, fmodstudioapi11006linux.tar.gz). Extrae y copia libfmod en monolibraries con:
$ cd ~
$ tar xf fmodstudioapi11006linux.tar.gz
$ cp api/lowlevel/lib/armhf/libfmod.so ~/monolibs/
Para FMODex, puedes usar el pequeño contenedor que escribí:
$ cd ~
$ git clone https://github.com/ptitSeb/fakemodex.git
$ cd fakemodex
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .
$ make -j2
$ cp lib/libfmodex.so ~/monolibs/
Extraer juegos Ahora, tenemos que instalar algunos juegos en ODROID. Los juegos necesitan usar FNA o MonoGames, los que proceden de GoG, HumbleBundle o incluso Steam en algunos casos. Todos necesitan ser la versión de Linux del juego. En la mayoría de los casos, la versión de Windows no funcionará. Debes tener en cuenta que la versión Steam de algunos juegos tampoco se ejecutará sin Steam no está activado (DRM) y puesto que no tenemos Steam en el ODROID, simplemente no podremos ejecutar el juego en ODROID. Utiliza la versión GOG o HB (o cualquier otra versión sin DRM) para los juegos que quieras ejecutar en tu ODROID.

Steam u otra versión instalada de Linux Si tiene una versión de Linux instalada del juego, simplemente copia la carpeta completa del juego y estarás listo para empezar a jugar. La versión Steam de FEZ o Owlboy, por ejemplo, se puede utilizar.

Versión Humble Bundle Ahora muchos juegos vienen como un único y gran archivo que termina en "-bin". Estos juegos se pueden extraer fácilmente: hay un archivo zip integrado y todos los juegos están dentro de la carpeta "data". Por ejemplo, "A Virus Named TOM" viene como "avnt-10192013-bin", y "Towerfall: Assension" es "towerfall-07212016-bin". Además, debido a que algunos juegos tienen un "data" que entraría en conflicto con la carpeta "data" extraída, vamos a cambiar el nombre temporalmente a "ODROID". Para preparar “A Virus Named TOM”, puede hacer lo siguiente:

$ cd ~
$ mkdir AvirusNamedTOM
$ cd AVirusNamedTOM
$ unzip ~/avnt-10192013-bin data/*
$ mv data ODROID
$ mv ODROID/* .
$ rm -r ODROID
Versión GOG  Los paquetes de juegos GOG son bastante similares a los de extracción. Para bastión, tengo un "gog_bastion_2.0.0.1.sh" que también contiene un archivo zip:
$ cd ~
$ mkdir Bastion
$ cd Bastion
$ unzip ~/gog_bastion_2.0.0.1.sh data/noarch/game/*
$ mv data ODROID
$ mv ODROID/noarch/game/* .
$ rm -r ODROID
Figura 02 - FEZ01

Lanzar los juegos Finalmente, estamos listos para un poco de acción. Necesitamos eliminar algunas librerías de la instalación en primer lugar. Debido a que utilizaremos la versión de Mono que viene con ODROID, y no la que está incluida en los juegos, primero tenemos que llevar a cabo algunas tareas de limpieza:

$ cd ~/AvirusNamedTOM
$ rm mscorlib.dll
$ rm System.*dll
$ rm Mono.*.dll
En la actualidad, algunos juegos (como A Virus Named Tom) usan TheoraPlay. Puede aparecer bajo 2 nombres: "TheoraPlay-CS.dll" o "TheoraPlay # .dll". Si ves algo de esto, asegúrate de reemplazarlo con el que compilamos antes o se bloqueará cuando se inicie el video (solo en 32bits, 64bits son seguros). Para la versión HB de A Virus Named TOM, será:
$ cd ~/AvirusNamedTOM
$ cp ~/monolibs/TheoraPlay-CS.dll TheoraPlay#.dll
Figura 03 - TwerFall04

Ahora podemos ejecutar el juego. Necesitamos configurar algunas cosas para que GL4ES emule OpenGL2 y también necesitamos usar todas las librerías que hay dentro de monolibraries. Localiza el archivo ".exe" y simplemente ejecútalo con mono. Para "A Virus Named TOM" los comandos son:

$ cd AvirusNamedTOM
$ LC_ALL=”C” LIBGL_ES=2 LIBGL_GL=21 LIBGL_DEFAULTWRAP=2 \
LIBGL_FBOFORCETEX=1 LD_LIBRARY_PATH=~/monolibs mono CircuitGame.exe
Podemos dar un paso más allá, usando componentes adicionales.

Remuestreo del audio Notarás que algunos juegos tardan un tiempo en inicializarse y usan bastante memoria. La mayoría de las veces, esto se debe al tema del sonido del juego, donde todo se carga en la memoria al inicio. Si tienes problemas de memoria o simplemente quiere experimentar, he desarrollado una pequeña herramienta que se puede utilizar para volver a muestrear los datos. La herramienta se compila fácilmente utilizando los siguientes comandos:

$ sudo apt install libsox-dev
$ cd ~
$ git clone https://github.com/ptitSeb/rexwb.git
$ cd rexwb
$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .
$ make
Usar la herramienta es bastante fácil. Tienes que entender que "xwb" WaveBank muestrea a 44 kHz, utilizando compresión MSADPCM. Aunque esto es bastante eficiente en Windows, la mayoría de las versiones en Linux expanden el MSADPCM al formato PCM clásico (por lo que el tamaño se multiplica por 4), lo cual lleva a tener grandes fragmentos del archivo de sonido en memoria. Remuestrear los sonidos en wavebanks a Mono (en lugar de Stereo) y remuestrear a 22kHz (o menos) reduce la demanda de memoria. Los juegos que tienen xwb incluyen "A Virus Named TOM" y "Stardew Valley". Encontrarás los bancos de ondas dentro de Content/Audio. Ten en cuenta que rexwb siempre trabaja sobre una copia de los bancos de ondas. Para volver a muestrear el banco de ondas de TOM (este juego tiene 2 bancos de ondas, solo el BGM puede volver a muestrearse, o ambos, dependiendo de la elección individual) a mono/22kHz usa los siguientes comandos:
$ cd ~/AvirusNamedTOM
$ cd Content/Audio
$ mv BGMwaves.xwb BGMwaves.xwb.sav
$ ~/rexwb/rexwb BGMwaves.xwb.sav BGMwaves.xwb 22050 -f -m
$ mv SFXwaves.xwb SFXwaves.xwb.sav
$ ~/rexwb/rexwb SFXwaves.xwb.sav SFXwaves.xwb 22050 -f -m
FEZ Con FEZ, tuve un problema en mi prototipo N1 con "Hardware Instancing". Este, sin duda alguna, es un error de GL4ES al que le tengo que seguir la pista (no tuve estos problemas en OpenPandora), así que, si tienes un bloqueo al inicio, simplemente desactiva Instancing en el menú de opciones. Además, este juego usa una enorme lista de más de 400,000 triángulos para trazar esas estrellas en la pantalla de Menú y en algunas pantallas de juego. Aunque algunos ODROID de gran potencial como el N1 pueden manejar esto, otros modelos pueden tener problemas con ese tipo de trazado. Puedes hacer una cosa en GL4ES para evitar este trazado. Con tu editor de texto favorito, dirígete a la carpeta gl4es y edite src/gl/drawing.c. Busca "#if 0" en ese archivo (alrededor de la línea 207) y cámbialo a "#if 1". Recompila la librería y cópiala en monolibraries para tener una versión que no trace el campo de estrellas y contar así con un menú principal más suave y sin problemas.

Figura 04 - FEZ

Stardew Valley He notado algunos problemas gráficos con Stardew Valley, pero nada serio con la versión de Steam. Una cosa a tener en cuenta es que algunos archivos DLL quieren cargar "oal_soft.dll". Debería ser redireccionado a "libopenal.so" pero por algún motivo no es así. La manera más fácil es crear un enlace simbólico dentro de la carpeta Stardew valley hacia "libopenal.so" llamado "liboal_soft.so" y funciona. En mi N1, que es ARM64, el comando sería:

$ cd ~/StardewValley
$ ln -s /usr/lib/aarch64-linux-gnu/libopenal.so libsoft_oal.so
Es similar en ARM de 32 bits:
$ cd ~/StardewValley
$ ln -s /usr/lib/arm-linux-gnueabihf/libopenal.so libsoft_oal.so
Figura 05 - Stardew Valley

A Virus Named TOM He probado este juego en el ODROID-N1. He tenido algunos problemas gráficos con este juego, donde la imagen está limitada a una subparte de la imagen completa. Probablemente sea un error de gl4es, pero también puede ser un error en el controlador GLES del N. No he visto ningún problema con OpenPandora durante mis pruebas.

Figura 06 - TOM

Bastion Este básicamente necesita FMODex. Así que probablemente necesitarás descargar FMOD y compilar el contenedor fakemodex para jugar a este juego.

Hammerwatch Aunque no es un juego FNA, Hammerwatch utiliza un motor personalizado y también está hecho en C #. Hammerwatch se puede ejecutar de la misma forma. Sin embargo, ten en cuenta que la última versión (1.32) usa FMOD para la música y el sonido, así que debe obtener la versión nativa del mismo (FMOD, no FMODex). La versión anterior (sin dlc) no usa fmod.

Otros juegos

Figura 07 - Dust: An Elysian Tail

Figura 08 - Towerfall

Figura 09 - Owlboy

Figura 10 - Owlboy

No dudes en dirigirte a los foros de ODROID y crear alguna publicación para que comentemos tus éxitos y fracasos con FNA.

Be the first to comment

Leave a Reply