Esta entrada es la continuación de la serie Juegos en Linux. Parte 1 y Juegos en Linux. Parte 2. Por lo que os recomiendo su lectura antes de continuar la del presente. Así, pasamos a través de este tercer capítulo a describir detalladamente que opciones de configuración de nuestros sistemas para prepararlos de cara a las pruebas de rendimiento. Linux (Arch Linux) vs Windows 7.

Una de las ventajas de Linux es que existen cientos de distribuciones donde elegir, en esta caso y para la prueba que vamos a realizar vamos a usar Arch Linux (64-bit) por diversas razones. En primer lugar, el sistema base de Arch es bastante reducido y no vienen con paquetes preconfigurados. Esto evitará que nos planteemos si existe algún proceso en background que se esté ejecutando y en consecuencia afectando al rendimiento del juego en las pruebas que vamos a realizar.

En lo que a la prueba en sistemas Windows se refiere, vamos a usar Windows 7 Ultimate, así que vamos a comparar lo último de Linux con la última oferta de Microsoft.

Benchmark en ambos sistemas. Características

A continuación se muestra una lista abreviada de los paquetes relevantes para nuestra prueba en la distribución Arch Linux. Vamos a lanzarlo sobre un escritorio Gnome por defecto, sin Compiz ni efectos similares.

Configuración de paquetes para Arch Linux

En la selección de juegos hemos hecho una mezcla de géneros y fechas de lanzamiento. Proporcionaremos así mismo más información sobre los nuevos lanzamientos testeados en este conjunto de entradas.

Selección de juegos para las pruebas

La mayoría de los juegos incluyen una evaluación comparativa del juego. Corremos cada benchmark tres veces y tomamos la media para los resultados finales. Eve Online requiere de una utilidad para mostrar los frames por segundo (fps), en tal caso nos encontramos con un registro de 180 segundos desde la estación vacía hasta que grabamos los FPS y la abandonamos. Nuevamente nos encontramos con estas pruebas 3 veces y hacemos el promedio de cada una de ellas. Una vez completada la evaluación comparativa, nos hemos tomado la molestia de ejecutar detenidamente y jugar con los juegos con el fin de garantizar la funcionalidad de los mismos o encontrar cualquier defecto.

Los resultados de esta comparativa en la próxima entrada.

A través de esta entrada vamos a introducirnos en el mundo del desarrollo de aplicaciones gráficas usando una librería llamada pygame que nos proporciona las herramientas necesarias para crear de forma relativamente sencilla nuestros juegos en el lenguaje de programación Python.

¿Qué es Pygame?

Pygame es un conjunto de módulos que nos ayudan a crear videojuegos o aplicaciones gráficas (no necesariamente videojuegos) en dos dimensiones. Pygame incluye gráficos y bibliotecas de sonido diseñados para ser utilizados directamente bajo Python. Está construido bajo Simple DirectMedia Layer (SDL), que a su vez son un conjunto de bibliotecas desarrolladas en lenguaje C, proporcionando las funciones básicas para realizar operaciones de dibujado 2D, gestión de efectos de sonido y música, y carga y gestión de imágenes. De esta manera, a través de Pygame podemos abstraernos de la lógica del juego (o aplicación) en si mismo, haciendo posible el uso de un lenguaje de alto nivel como Python para estructurar el juego.

Pygame fue contruido como sustituto de pySDL, después del poco éxito del mismo, ya que la forma de interactuar no llegó a recoger tantas opciones y tan simples como las del entorno de Pygame.

Escrito originalmente por Shinners Pete se distribuye bajo la GNU Lesser General Public License. Desde 2004 se trata de un proyecto de código abierto de la comunidad de software libre.

Instalando Pygame y el entorno

Antes de comenzar a ver una serie de ejemplos generales a modo de introducción en el mundo de Pygame vamos a configurar nuestro sistema para poder importar los módulos de Pygame desde Python, como cualquier otra librería.

La instalación es bastante simple. Suponiendo que nuestro sistema corre una distribución basada en Debian y que ya corre la versión más reciente de Python, de tal forma bastará con usar un gestor de paquetes e instalar el paquete python-pygame y satisfacer todas sus dependencias. Así, y de la forma más intuitiva usaremos las dos vías principales, usando el adminstrador de paquetes en modo texto APT y su versión gráfica Synaptic.

En el primero de los casos la instalación es bastante sencilla, abrimos un terminal y ejecutando como superusuario (root) lanzamos la herramienta apt-get como se indica a continuación y cómo se observa en la figura 1.

$ sudo apt-get install python-pygame

Y nos preguntará si deseamos instalar todos los paquetes anexos y dependencias, a lo que responderemos afirmativamente.

Figura 1 Instalación mediante el gestor de paquetes APT

Usando el gestor de paquetes Synaptic la operación es similar, nos dirigimos a System → Administration → Synaptic Package Manager, localizamos el paquete python-pygame y lo marcamos para instalar, cómo se muestra en la figura 2. Aplicamos los cambios aceptando todas las dependencias y listo, ya tenemos nuestro entorno preparado nuestro entornor para empezar a trabajar con Pygame.

Figura 2 Instalación mediante el gestor de paquetes Synaptic

Uno de mis entornos de programación preferidos es Geany, un IDE desarrollado en GTK y que se define así mismo como: A fast and lightweight IDE. Aconsejo su uso ya que nos resultará bastante sencillo probar los ejemplos planteados.

Para su instalación, y de forma análoga a Pygame, localizaremos el paquete geany y satisfaceremos sus dependencias si se precisan, así con APT y cómo se muestra en la figura 3:

$ sudo apt-get install geany

Figura 3: Instalación del IDE Geany

Nuestro primer programa…

Vamos a proceder con un ejemplo muy básico de uso. Abrimos nuestro IDE de Python (Geany) y probamos con el siguiente código, en este se dibujará un fondo sobre una ventana y dos lineas diagonales que cruzarán los extremos de izquierdas a derechas y de arriba a abajo y al contrario. Así, el código comentado:

# -*- coding: utf-8 -*-

# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame, sys
from pygame.locals import *

# Inicializamos Pygame
pygame.init()

# Definimos el color de fondo y el de la diagonal
COLOR_FONDO = (50, 150, 200)
COLOR_LINEA1 = (255, 0, 0)
COLOR_LINEA2 = (0, 0, 255)

# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))
refresco = pygame.time.Clock()

while True:
time_passed = refresco.tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()

# Fijamos el color de fondo y las lineas de diferentes colores, y lo sacamos por display
pantalla.fill(COLOR_FONDO)
pygame.draw.aaline(pantalla, COLOR_LINEA1, (1, 1), (799, 599))
pygame.draw.aaline(pantalla, COLOR_LINEA2, (799, 1), (1, 599))
pygame.display.flip()

NOTA: Para lanzar directamente la aplicación desde el IDE Geany podemos hacerlo pulsando F5 o desde el icono designado para esta operación.

De esta forma, el resultado que obtenemos tras ejecutar nuestra primera aplicación es el mostrado en la figura 4.

Figura 4: Ejecutando nuestro primer programa

Controlando los eventos

Es posible que al empezar en la programación de aplicaciones gráficas mediante Pygame nos surjan dudas acerca del manejo de eventos a través del programa desarrollado. Es por ello que vamos a dedicar este pequeño apartado a tratar de aclarar las diferentes maneras que tenemos para registrar los eventos que se suceden en nuestra aplicación.

Será importante diferenciar los métodos que pueden ayudarnos a registrarlos a guardarlos de una forma temporal antes de ser analizados. Así:

  • pygame.event.get: Obtenemos los eventos mediante una cola. Esta función es la usada en el ejemplo anterior, de forma que definimos un tiempo de refresco a partir del cual recorremos los eventos registrados y ejecutamos sus acciones asociadas. Esta es quizás la forma más común de registro de eventos no forzado, y de esta manera no nos obliga a realizar una pulsación o control del flujo del programa en un punto.
  • pygame.event.poll: Obtenemos un evento simple de la cola. Simplemente es capaz de guardar el último evento sucedido. Resulta práctica cuando únicamente queremos dejar constancia de un evento registrado en un intervalo de tiempo definido.
  • pygame.event.wait: Espera un evento de la cola. Este lo he usado en el ejemplo planteado a continuación, de forma que podamos ir viendo algunos de los eventos que podemos controlar así como estudiar las posibilidades que nos ofrece esta vía de registrar eventos.

Podemos ver el resto de eventos accesibles por teclado en el siguiente enlace: Documentación oficial de Python.

El ejemplo que muestra su uso, a continuación:

# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *

pygame.init()
pygame.display.set_mode((200, 200))
pygame.display.flip()
event = pygame.event.poll()

while True:
cursor = pygame.mouse.get_pos()
evento = pygame.event.wait()
if evento.type == QUIT or evento.type == K_ESCAPE:
print ”Has abandonado la aplicación”
raise SystemExit
if pygame.mouse.get_pressed()[0]:
print ”Has usado el botón izquierdo del ratón”
if pygame.mouse.get_pressed()[1]:
print ”Has usado el botón central del ratón”
if pygame.mouse.get_pressed()[2]:
print ”Has usado el botón derecho del ratón”
if evento.type == KEYDOWN and evento.key == K_SPACE:
print ”Has pulsado espacio”
if evento.type == KEYDOWN and evento.key == K_BACKSPACE:
print ”Has pulsado backspace”

La figura 5 muestra su ejecución:

Figura 5: Controlando los eventos de la aplicación

Más figuras e imágenes

Al estar basado en SDL, Pygame tiene la capacidad de poder mostrar imágenes así como formas básica de una forma casi trivial, las primitivas que se encargan de realizar estas operaciones las comentamos en el siguiente ejemplo y vemos su resultado:

# -*- coding: utf-8 -*-

# Importamos las librería de Pygame y las del sistema, necesarias para forzar el cierre
import pygame
from pygame.locals import *

# Inicializamos Pygame
pygame.init()

# Definimos el color de fondo y el de las figuras
COLOR_FONDO = (50, 100, 50)
COLOR_CUADRADO = (255, 0, 0)
COLOR_CIRCULO = (0, 0, 255)
# Cargamos la imagen y hacemos transparente el fondo (antes verde)
imagen_nave = pygame.image.load(‘nave.bmp’)
imagen_nave.set_colorkey((0, 255, 0))

# Definimos el tamaño de la aplicación y la tasa de refresco
pantalla = pygame.display.set_mode((800, 600))

while True:
time_passed = pygame.time.Clock().tick(30)
# Comprobamos el cierre de la aplicación y en caso afirmativo lanzamos la función salir
for event in pygame.event.get():
if event.type == QUIT:
raise SystemExit

# Fijamos el color de fondo y dibujamos las figuras y la imagen
pantalla.fill(COLOR_FONDO)
pygame.draw.rect(pantalla, COLOR_CUADRADO, (50, 50, 100, 100))
pygame.draw.circle(pantalla, COLOR_CIRCULO, (400, 300), 75 )
pantalla.blit(imagen_nave, (500, 400))
# Actualizamos la pantalla
pygame.display.flip()

NOTA: Podemos ver cómo al no disponer de transparencia la imagen de la nave se la fijamos mediante el método set_colorkey().

Y el resultado lo podemos ver en la figura 6.

Figura 6: Ejemplo con figuras e imágenes

Y el sonido

Para terminar con esta introducción a Pygame vamos a realizar un test de sonido, para lo cual usaremos la el módulo mixer. El ejemplo:

# -*- coding: utf-8 -*-

import pygame, os
from pygame.locals import*

# Iniciamos el módulo mixer
pygame.mixer.init()
# Cargamos la pista de audio haciendo uso del sistema, mediante el cual podemos indicar rutas relativas sin dependencia del sistema operativo
pygame.mixer.music.load(os.path.join(“1vs0_JuniorGroove.ogg”))
# Y reproducimos la pista cargada de forma continua, valor -1.
pygame.mixer.music.play(-1)

Podéis consultar el resto de opciones desde la documentación de Python.

NOTA: La pista de audio utilizada tiene licencia Creative Commons, 1vs0 – Junior Groove.

Bibliografía

Esta entrada es la continuación de Juegos en Linux. Parte 1. Para lo que lo que os recomiendo su lectura. Así, pasamos a través de este segundo capítulo a describir detalladamente que opciones de emulación se nos presentan a la hora de ejecutar Juegos en Linux.

Ahora que tenemos una visión general de Wine es el momento de profundizar un poco en las aplicaciones que ya comentamos antes, Cedega y CrossOver. Los dos objetivos principales de ambas es ofrecer soporte a juegos adicionales y una interfaz de usuario más amigable que el que actualmente ofrece el proyecto Wine.

Desde la versión 2.1, Cedega ha desarrollado su propio código sin usar los fuentes públicos de Wine. Esto se debe a lo que en la pasada entrada comentamos sobre el cambio de licencia de MIT a LGPL que ocurrio en Wine en 2002. Bajo licencia LGPL Cedega se vería obligada a publicar todo su código fuente. El resultado final es que la mayoría del código de Cedega es abierto, pero la interfaz, la compresión de texturas, y algunas otras partes (posteriores a la adaptación) no son libres.

La interfaz y la facilidad de uso es lo que la mayoría de la gente busca, pero hay otros muchos beneficios a pagar. En primer lugar, obtenemos una aplicación ya compilada y lista para trabajar desde nuestra distribución Linux, y en el caso de no tenerla disponible porque nuestra distribución sea algo más inusual tenemos la posibilidad de obtener una binario precompilado. Al hacernos con una copia de Cedega también tenemos la posibilidad de votar sobre que juegos deseamos que tengan soporte en las siguientes versiones, lo que repercutirá directamente sobre las prioridades en el desarrollo de las mismas.

Cedega tiene un precio 25€ en adelante, dependiendo de la suscripción que tengamos. Si sólo queremos la versión libre, ya no tendremos la posibilidad de una interfaz de usuario e igualmente hemos de registrarnos para obtenerla.

CrossOver Games, a diferencia de Cedega, utiliza el código fuente actual de Wine y emplea a parte de los desarrolladores de Wine para manejar su código propietario. CrossOver también contribuye código al proyecto Wine con licencia LGPL. Esto quiere decir que la mayoría del código fuente de CrossOver está disponible, y pagando podemos obtenerlo completo y obtener una mejor experincia, de lo contrario tendremos recompilarlo y aplicarle los correspondientes parches como ocurre con Cedega.

CrossOver está disponible para Mac OS y Linux, la versión de Linux tiene un precio de 37€ y la profesional para este mismo sistema 64€, con funciones mejoradas y mayor soporte. La versión libre incluye interfaces de usuario, pero sigue siendo menos deseable que la versión de pago.

Una de las características que echamos de menos en Wine es que, a diferencia de Cedega y CrossOver, carece de una interfaz intuitiva y amigable. Para los usuarios más nóveles la opciones que se les presentan son las dos propietarias presentadas, debido a lo comentado anteriormente, su facilidad de uso.

En cuanto a compatibilidad del juego, los tres proyectos usan un sistema similar de clasificación. Wine y CrossOver usan medallas: Oro significa que se puede instalar y jugar como se espera; Plata que se puede instalar y jugar lo suficientemente bien como para ser utilizado, pero que posiblemente se encuentren errores o problemas de rendimiento; y Bronce que se puede instalar y ejecutar al menos parcialmente, pero es probable que existan errores. Wine agrega a su clasificación la medalla de Platino (Platinum) que es para juegos que se pueden instalar y ejecutar sin problemas. Cedega en tal caso los clasifica así: Cedega Certified, tick verde (Platino/Oro), aspa roja (Plata) y exclamación (Bronce), además de los que no tienen clasificación o los que ya se saben que no son compatibles. En tal caso las clasificaciones para los tres proyectos son similares.

En los últimos años ha habido una pregunta común sobre el enfrentamiento entre Linux y Windows, ¿tiene la capacidad Linux de correr los ultimos juegos de mayor éxito? y si es así, ¿cuál es la diferencia de rendimiento entre ambos? Muchas comunidades en la red y el mundo de los juegos en general pasan por alto a Linux como una plataforma de juegos viable. Mi intención no es otra si no mostrar qué funciona y qué no de la forma más objetiva posible, así como intentar ver los datos de rendimiento para los que buscáis (y espero que así sea) otra opción en el mundo de los juegos.

Desafortunadamente, existen muy pocos juegos que puedan ejecutarse nativamente en Linux, en Linux Hispano ya nos hicimos eco de la situación y es por ello que disponemos de una sección dedicada a estos, Linux Hispano Juegos. Para combatir este problema existen algunos proyectos que nos permiten ejecutar aplicaciones de Windows. Me gustaría destacaros tres proyectos con el fin de introduciros en el mundo de los juegos en Linux.

  • El primero de ellos, como muchos de vosotros conoceréis, es el proyecto de código abierto Wine, fácilmente descargable y configurable se creo con la idea de poder correr aplicaciones de Windows sobre máquinas Linux, así como, en el caso que nos compete, juegos.
  • La segunda opción es Cedega, se trata de una modificación de Wine, pero en este caso se trata de código cerrado. Es posible que os preguntéis cómo pudieron cerrar un código libre, y es que se aprovecharon de los inicios de Wine, cuando la licencia que usaban no defendía tales derechos de autor. Cualquiera que fuera el caso, se trata de una aplicación bastante completa que se centra principalmente en dar soporte a los nuevos lanzamientos de juegos en plataformas Windows e incluir las correspondientes librerías para poder lanzarlo a través del mismo, así como las pertinentes modificaciones sobre el código inicial de Wine.
  • La tercera que os presento es CrossOver Games, que al igual que Cedega, se trata de una aplicación de código cerrado derivada de Wine que permite de una forma más atractiva el ejecutar aplicaciones win32 sobre Linux.

Es posible que muchos de vosotros os preguntéis ahora qué es Wine. El proyecto Wine comenzó sobre 1993 para permitir que aplicaciones Windows puedan ejecutarse en entornos Linux. Wine toma la API de Windows (Application Programming Interface) y la implementa en el espacio de usuario de Linux. Comparte muchos recursos con el, que seguro muchos conoceréis, proyecto ReactOS, un proyecto para el desarrollo de un Sistema Operativo libre que pueda correr aplicaciones Windows.

Puesto que Wine se ejecuta en el espacio de usuario y, en consecuencia, no forma parte del núcleo de Linux, se basa en un demonio wineserver que proporciona la funcionalidad básica del núcleo de Windows, así como otras tareas de integración con el entorno X que usemos (Gnome, KDE, XFCE, etc.).

En las posteriores entregas veremos cómo comparar el rendimiento y la funcionalidad entre juegos corriendo en entornos Linux y Windows; además de comparar estas mismas características bajo Wine, Cedega y CrossOver Games.

Continuación en: Juegos en Linux. Parte 2