Lecciones de portar videojuegos a GNU/Linux

A principios de esta semana Valve y NVIDIA hicieron una presentación explicando lo que aprendieron al portar juegos de Windows a GNU/Linux, concretamente el motor gráfico Source.
Dicha presentación se puede ver en YouTube y las transparencias se pueden descargar de la web para desarrolladores de NVIDIA.

Dicha presentación explica unos cuantos puntos clave que resultan bastante interesantes. Desde porqué portar a GNU/Linux, pasando por unas breves explicaciones de mercado y terminando con cantidad de detalles técnicos para los desarrolladores.
Así pues, primero de todo: ¿porqué portar a GNU/Linux? Sencillamente porque éste es un sistema abierto (y libre), además está ofreciendo un crecimiento rápido y permite dar un salto más fácil al mercado móvil donde también se emplea OpenGL y Android en concreto utiliza también el núcleo Linux. GNU/Linux además ofrece mayor rendimiento y ya cuenta con una plataforma de distribución digital como es Steam. El Ubuntu Software Centre también sería otra.

Indagando aún más en OpenGL, esta biblioteca expone funcionalidad según el hardware que se tenga, no según el sistema operativo. Esto es importante ya que con Direct3D si quieres las posibilidades que ofrece Direct3D11 debes tener Windows Vista como mínimo, y para Direct3D 10 lo mismo, estas API no funcionan sobre Windows XP. Esto supone un problema para mercados como el chino donde mayormente siguen funcionando con Windows XP por lo que los usuarios no tienen acceso a las nuevas funcionalidades como la teselación, compresiones de textura mejoradas, rendering multi hilo o mejor precisión de color.

Sin embargo los equivalentes a OpenGL de D3D11 y D3D10 como son OpenGL 3.x y OpenGL 4.x sí se pueden instalar en Windows XP. Además, cabe recordar que el gobierno chino llegó a un acuerdo con Canonical para desarrollar una versión personalizada de Ubuntu llamada Ubuntu Kylin. Obviamente sobre ese sistema sólo funciona OpenGL.

Por cuotas de mercado, los dispositivos D3D10 (OpenGL 3) y D3D11 (OpenGL 4) tienen mayoría de mercado por lo que estos serían los principales objetivos de desarrollo, algo que aún no es así dado que otro público objetivo importante como son las consolas aún siguen basadas en funcionalidades tipo D3D9 (OpenGL 2), pero con la nueva generación se podrán emplear las nuevas funcionalidades en todas las plataformas sin ningún problema.

Otras ventajas de OpenGL es que sus especificaciones son públicas y la API está desarrollada por un comité al cual puede entrar cualquiera que tenga interés, aunque se requiere cierto aporte económico. OpenGL puede ser ampliado al gusto de una forma rápida y tiene una buena potencia, en el sentido de que permite hacer muchas cosas.

Hasta aquí lo referente a OpenGL. Portar un motor gráfico no sólo significa cambiar de API, si vas a utilizarlo en sistemas diferentes hay otras muchas cosas a tener en cuenta, como por ejemplo el mostrar las ventanas, sistemas de archivos, llamadas a sistema, etc.

Para el manejo de ventanas se propone el uso de SDL ya que es multiplataforma, incluyendo a móviles. Está implementado en C y contiene todo lo que se necesita, ni más ni menos. Valve lo ha utilizado para todos sus ports incluyendo Steam.

En cuanto a los sistemas de archivos, a diferencia de Windows los sistemas tipo UNIX como GNU/Linux son sensibles a las mayúsculas, por lo que no es lo mismo un archivo que se llame MiFoto.jpg que otro llamado mifoto.jpg. Esto puede suponer un problema durante el desarrollo por lo que habría que establecer algunas normas: O bien todos los recursos escribirlos en minúsculas incluyendo directorios y convertir a minúsculas todas las búsquedas de archivos que se hagan dentro de la raíz de la carpeta de desarrollo o bien crear una caché de archivos y buscar los que tengan un nombre similar.

Otros problemas que se pueden dar están relacionados con la internacionalización. El manejar distintos idiomas puede dar problemas con los printf/scanf. Se puede solucionar utilizando el en_US.utf8 y manejar la internacionalización internamente. Los que no tengan instalado el idioma en_US deberían ser avisados.
También existen problemas con los tipos de letra, el input de ratón que a pesar de ser en crudo (/dev/...) hay algunos manejadores de ventanas que también capturan el teclado rompiendo la funcionalidad del Alt-Tab.
Cabe mencionar problemas con múltiples monitores, algo que está menos pulido que en Windows aunque por suerte SDL se hace cargo de ello y no resulta por tanto algo insuperable.

Volviendo a OpenGL, lo que proponen Valve y NVIDIA es añadir una capa, "togl" para
traducir las llamadas Direct3D a OpenGL. Esto es factible dado que el 99.9% del código no sabe qué API se está usando, incluso en el rendering.
Claramente el rendimiento era una preocupación pero no un problema, resulta que pese a añadir esa capa de traducción adicional el rendimiento es un 20% superior. Una muestra de la mayor rapidez de Linux+OpenGL.
Respecto a la eficiencia (por si lo del 20% no es suficiente muestra), a pesar de que OpenGL puede requerir muchas llamadas es muy eficiente. Basta con hacer un buen profiling de la aplicación para darse cuenta. Con el soporte de extensiones de los fabricantes se pueden tener funcionalidades adicionales de forma eficiente y además multiplataforma.
Y pese a poder llegar a ser demasiado descriptivo, OpenGL premite mantener un número de llamadas muy similar al de Direct3D ya que hay funciones que son equivalentes a dos o tres llamadas sobre un mismo objeto, que complementándolo con el uso de funciones inline el hecho de tener múltiples llamadas queda mitigado.

Estas explicaciones y otros muchos detalles más técnicos los podréis encontrar en el vídeo de la presentación y/o en las transparencias.

Comentarios