Multiprogramación en Linux

He estado programando en multiproceso, para aclarar algunos conceptos, ya que en C++ no tenía mucha experiencia …
He subido el programa a pastebin, por si le puede ser útil a alguien que este empezando:

http://pastebin.com/kkqtc5f1 Se compila sin nada raro: g++ multiproceso.cpp -o multiproceso.

Hago uso de fork(), semaforos compartidos, memoria compartida …

Lo protendo implementar, (mucho más elaborado, y en su sitio), en mi PFC, ya que actualmente tengo un grado de concurrencia, pero solo a nivel de hilos, (multihilo), y ya que estoy planteando el juego de forma muy distribuida, estoy llegando fácilmente a tener entre 500 a 1000 hilos. Con esas cifras, que evidentemente debo reducir, ya que corro el peligro de sufrir mucho overheating en el planificador.

Todavía tengo que hacer pruebas para ver si es viable, pero mi intención es poner en otro proceso la capa de IA al menos, y la capa de animaciones, y tal vez otro procesos más, solo para raycasting. La comunicación entre procesos, pretendo que sea algo parecido al pastebin, pero implimentandome un heap que gestione los huecos.

Por fin termina el curso

En poco más de 2 horas tengo el último examen … (Aunque me queda una práctica sobre concurrencia para el día 25.)

El caso, es que ha sido un gran año(a costa de bajar la los posteos del blog y no tener nunca tiempo …), y prácticamente no me queda nada para acabar la carrera el año que viene. En el primer cuatrimestre solo me matricularé a 2 asignaturas !. En el segundo habrá que esperar a las notas, pero calculo que unas 6 asignaturas. Lo que me deja un año bastante sabático para centrarme en el PFC.

Me he matriculado a 2 curos de verano, que organiza la universidad:

El segundo curso, me he matriculado porque precisamente sobre algo parecido a eso, quiero dedicar mi PFC.  Todavía no tengo un profesor, ni he hecho el anteproyecto, pero me pondré a ello en el mes de julio. Pero ya tengo mucho código escrito, y muchas ideas pensadas.

El PFC me gustaría hablar sobre la arquitectura de los juegos. Me gustaría hacerlo en 2 partes: Una parte densa teórica. Y una implementación práctica.

Voy a comprar unos cuantos libros por amazon, y sobre todo estudiar el código de John Carmack (quake 1,2 y III). Como gran referente y pionero en crear buenas arquitecturas en los juegos.

El PFC es bastante ambicioso por lo que no descarto, hacer un PFC más modesto, y postponerlo para el Grado de Ingeniería Informática. Ya que cuando acabe me gustaría convalidar con GII y hacer 2 años más. Para entonces habré aprendido más sobre IA, y otros temas, y estaré más preparado que ahora.

Cambiando de tercio, he recibido ya un total de 25€ (restar las tarifas de paypal) en donaciones (de españoles 0€, ojo al dato) para el proyecto Wiithon, por lo que me siento un poco en deuda. Además que utilizando Wiithon como usuario, todavía se pueden mejorar algunas cosas. Como probar que tal funcionaría con una SGBD decente, en lugar de sqlite. En mi caso, tengo más de 600 juegos de Wii y aunque va muy rápido, en ordenadores de +4 años, se nota que sqlite se queda corto.

Bueno, me voy al examen, que le pedido salir al jefe antes : D

Habrá Steam para Linux

Hace unos días, Valve ha lanzado la versión de Mac de Steam por todo lo alto, acompañado de ofertas y regalando el Portal.

En un artículo en el Telegraph se ha dicho:
«Valve has also confirmed that it will make Steam available to Linux users in the coming months.»

Cada vez siento que estamos más cerca de un mercado multiplataforma … pero todavía falta mucho, lo que esta claro es que es un paso importante para el Gaming.

En cuanto al rendimeinto, si Valve ha llevado sus juegos a Mac, que es una plataforma prima respecto a Linux (pero con un rendimiento bastante menor que en Linux como se demuestra en esta benchmark). Tras esta confirmación, Linux ofrece un rendimiento muy ligeramente inferior a windows actualmente, (principalmente por la calidad de los drivers).

Todos estos temas se debaten en este articulo, y llegan a la conclusión de que esta noticia puede representar toda una revolución para el mercado de los videojuegos en Linux:
http://www.phoronix.com/scan.php?page=article&item=valve_steam_announcement&num=1

Ahora solo falta pedir que su cliente  se licencie como GPL, lo cual, conociendo a Valve es casi imposible. Un saludo.

P.D: Me gustaría escribir más, pero este año estoy concentrado en la uni y he abandonado más de lo que me gustaría el wiithon y el blog. ¡¡ Quiero terminar el cuatrimestre !!

Fuentes:
http://www.telegraph.co.uk/technology/apple/7715209/Steam-for-Mac-goes-live.html
http://www.muylinux.com/2010/05/12/ya-es-oficial-%C2%A1steam-estara-disponible-en-linux

Wiithon 1.1 publicado!

Actualizado: sábado, 21 de noviembre de 2009

Bueno por fin publicamos la nueva versión tras casi 5 meses desde el anuncio de la 1.0.
Para mi wiithon me ha aportado mucho en conocimientos, me he acostumbrado tras muchos años de SQL puro, el uso de bases de datos ORM. He aprendido la potencia del combo python + pygtk. He aprendido a crear paquetes deb que siguen las políticas de Debian. Crear manpages, hacerme un repositorio de paquetes, resolver conflictos de bazaar, subir paquetes, comprender los problemas de punteros en 32bits y 64 bits y por último, he aprendido a amar a los Makefiles y esa gran satisfacción de hacer cosas complejas de forma controlada y sencilla.

Sin más rollo os pongo un tutorial mucho más simplificado, si lo comparamos con el de la versión anterior:

  1. Novedades
  2. Características ya existentes
  3. Reporte de bugs
  4. Instalación
  5. Actualización
  6. Uso de Wiithon en Consola (CLI)
  7. Descargar código fuente
  8. Colaborar en Wiithon
  9. Estado de traducción de Wiithon.
  10. Team wiithon
  11. Pantallazos

Seguir leyendo

Vala: Eficiencia de C++ y Estilo de C#

Hace tiempo hice mis primeros pinitos en mono, mediante ASP.NET pero como ya puse en ese post, no me terminaba de convencer que las decisiones de la comunidad libre sean inexistentes y quedemos vendidos a mono frente a una política comun en Microsoft: Adoptar, Extender y Extinguir.

Vala es una alternativa a mono iniciada por los desarrolladores de GNOME:
http://live.gnome.org/Vala

Aqui unos benchmarkings, como podeis observar,  su rendimiento comparado con mono es aplastante, y juega en la misma liga que los mismisimos C/C++.

Nombre del benchmarking C++ Mono plain-C Vala
mandelbrot 14.50 54.61 12.39 13.13
partialSums 33.04 56.13 35.00 34.95
recursive 12.94 30.14 8.44 8.72
binaryTrees 27.87 43.87 21.56 30.84
sumFile 17.11 22.89 13.99 15.06
fannkuch 11.46 27.05 11.26 12.44
spectralNorm 32.82 49.82 33.25 33.36
nsieve 25.32 28.03 25.31 25.09

De hecho lo estoy considerando para programar videojuegos, ya que es lo que siempre he deseado, un alto nivel que te ahorra tiempo con eficiencia de código nativo, sin maquinas virtuales. Lo digo por este ejemplo de Vala en OpenGL: http://live.gnome.org/Vala/OpenGLSamples

Como inconveniente, habría que analizar su capacidad de multiplataforma (incluso con KDE).

Por último os pasteo un poco de código de Vala para que veais que se aprende en 2 tardes sabiendo algo de C/C++/C#.

public class NumberGuessing {

    private int min;
    private int max;

    public NumberGuessing (int min, int max) {
        this.min = min;
        this.max = max;
    }

    public void start () {
        int try_count = 0;
        int number = Random.int_range (min, max);

        stdout.printf ("Welcome to Number Guessing!\n\n");
        stdout.printf ("I have thought up a number between %d and %d\n", min, max);
        stdout.printf ("which you have to guess now. Don't worry, I will\n");
        stdout.printf ("give you some hints.\n\n");

        while (true) {
            try_count++;

            stdout.printf ("Try #%d\n", try_count);
            stdout.printf ("Please enter a number between %d and %d: ", min, max);
            int input = stdin.read_line ().to_int ();

            if (number == input) {
                stdout.printf ("Congratulations! You win.\n");
                break;
            } else {
                stdout.printf ("Wrong. The wanted number is %s than %d.\n",
                               number > input ? "greater" : "less", input);
            }
        }
    }

    public static int main (string[] args) {
        var game = new NumberGuessing (1, 100);
        game.start ();
        return 0;
    }
}

Fuente:
http://live.gnome.org/Vala
http://code.google.com/p/vala-benchmarks/wiki/BenchResults

Wiithon 1.0 liberado!!

POST ANTICUADO, última versión wiithon: 1.1 https://blogricardo.wordpress.com/2009/11/20/wiithon-1-1-publicado/

Actualizado: martes, 28 de julio de 2009

Creo que ya es el momento de publicar esta versión de wiithon con un GUI basado en GTK. Un desarrollo que empeze en abril, (trás publicar wiithon 0.98) sin tener apenas expriencia en GTK, gracias a Jose Luis Segura(LK2) y Google, he aprendido lo sufuciente en GTK para llegar al punto en el que estamos.

Sin dar más vueltas os expongo ls partes que va a tener esta presentación:

  1. Características
  2. Descargas
  3. Instalación
  4. Ejecución
  5. Actualización
  6. Traducir wiithon
  7. Agradecimientos.
  8. Team wiithon
  9. Screenshots

Seguir leyendo

Screenshot wiithon

Cada vez estamos más cerca de una versión estable, hoy llevo toda la tarde probando el buscador y va muy muy fino. (Utilizo un ORM llamado SQlAlchemy que a su vez esta basado el SQLLite).
Seguir leyendo

Laberinto TD, ganador del MobiGame 2009 !!!

Este es el primer año que me presento al MobiGame e incluso que aprendo J2ME como ya dije en «Aprendiendo J2ME para el MobiGame«, aunque si que he trasteado mucho con J2SE (tengo un juego Java tipo Worms por hay subido que  hice con 14 tacos y ahora tengo 23).

Gracias al ejemplo de GameCanvas que viene con NetBeans no tardé ni un rato en tener una primera versión de un muñeco moviéndose por el escenario. Un mes después presente todo el análisis y diseño y alguna screen (solo había 1 tipo de torre y 1 tipo de enemigo en ese momento.)

Ha sido mi primer año y realmente me ha gustado mucho, ha habido muy buenos juegos y cualquiera podría haber ganado, estaba muy igualado. Os doy las gracias a todos los participantes por haber hecho que realmente haya competición. También gracias a la organización y todo el ambiente que han creado.

Seguir leyendo

wiithon . WBFS GUI en Linux para WII . v0.98!

POST ANTICUADO, última versión wiithon: 1.1 https://blogricardo.wordpress.com/2009/11/20/wiithon-1-1-publicado/

Seguir leyendo

Presentación de Laberinto Tower Defense

Llevo 4 fines de semana haciendo el desarrollo de Laberinto TD. Aunque el análisis y diseño es un trabajo de mucho tiempo (meses/años) de un juego que estaba haciendo (y cuando pueda lo seguiré) en c++.
El juego es una defensa de Torretas, como los custom maps del Warcraft3 y esta desarrollado más o menos al 50%:
Las caracteristicas del juego son las siguientes:

  1. Busqueda de caminos por los enemigos mediante IA, he implementado el algoritmo A*.
  2. 10 mapas, 50 niveles y 4 dificultades.
  3. Haré unos 10 tipos de torretas: hielo, splash, arrow, aura, aturdir, laser,veneno, invis, ultimate ….
  4. Cada tipo de torreta se podrá actualizar entre 5 y 20 levels.
  5. Todo se financiara con oro, la forma de obtenerlo es matando enemigos y consiguiendo hitos.
  6. Haré unas instrucciones de uso y ayudas en distintos menús de elección.
  7. Se guardarán persistentemente las máximas puntuaciones en cada mapa.
  8. Las condiciones de victoria es pasarte los 50 niveles.
  9. Las condiciones de derrota es no perder todas las vidas o alcanzar un número de máximo de enemigos.

Os pongo algunas imagenes:

Acepto cualquier sugerencia e idea. En mi opinión si consigo implementar todo lo que tengo pensado el juego puede ser un autentico vicio en esta o en cualquier plataforma. Espero que al menos os parezca interesante. Un saludo.

Aprendiendo J2ME para el MobiGame

Me voy a presentar el MobiGame (a punta de pistola por nuestro profe de informática distribuidda). Tengo poco tiempo asi además de enpoyarme el API de MIDP 2.0 aprovechare el análisis y diseño de mi maze tower hecho en una arquitectura muy distinta (pc, c++, physx , ogre …). Ya pondre algun post de mis avances. Mientras tanto usaré estos post para ir poniendo recursos que me parezcan interesantes.

Desde luego un torretas para movil sería algo muy novedoso en esta plataforma, y yo sería el primero que me estaría viciando por eso lo hago ;D

Español:

http://leo.ugr.es/J2ME/MIDP/index2.htm

http://www.it.uc3m.es/celeste/docencia/j2me/tutoriales/midp2_0/PracticaGame/

http://www.lcc.uma.es/~galvez/J2ME.html

Ingles:

http://wiki.netbeans.org/CreatingJavaMEGamesWithGameBuilder

http://today.java.net/pub/a/today/2005/02/09/j2me1.html

http://developers.sun.com/mobility/midp/articles/gameapi/

http://www.mcobject.com/perst_eval

Procesar y borrar elementos de una lista en O(n)

Voy a explicar que elección de diseño he elegido en mi juego para la gestión de la lista de entidades.

En todo videojuego hay una lista de entidades que necesitan hacer en su máximo nivel de abstracción 2 cosas:

  1. Procesar todos los elementos. Esto es que cada elemente tiene un metodo, tipicamente refrescar() o update() que abstrae toda la secuencia de proceso que tiene que hacer.
  2. Borrar los elementos que han muerto o a terminado su ciclo de vida.

Poder borrar el elemento de lista me dificulta la implementación, asi que he optado por que el nodo tenga un método en el que solicita la liberación. Cuando llege su turno será eliminado. Esto tambien lo hago así por que physX exige borrar sus entidades en puntos muy concretos de muy código. Cuando no lo hacía así cada 5 min de juego tenía un «segmentation fault» que me crasheaba el juego.

Hay infinitos ejemplos por los que hay que borrar una entidad. Un bot que ha cumplido su objetivo.
Por ejemplo, suponer que una entidad (un proyectil en concreto) que se mueve, esto lo hace durante el refresco, se sale del mapa, cuando se salga queremos borrarlo. Por tanto en pseucódigo será.

if(estoyDentroDeLimites())
	avanzar();
else
	pedirLiberacion();

Cuando a otro nivel llamamos al proceso de las entidades, el proceso debería quedar algo así.

void procesarSeleccionados ( list<Nodo*> * lista )
{
	Nodo * aux = NULL;
	list::iterator it = lista->begin();
	while(it != lista->end())
	{
		aux = *it;
		if(aux->getPedirLiberacion() && aux->liberar())
		{
			delete aux;
			it = lista->erase(it);
		}
		else
		{
			aux->refrescar();
			i++;
		}
	}
}

Estoy utilizando una lista del STD.  Comentar:

  • El if() podríamos sustituirlo por la condición de borrado. En este ejemplo significa:
    • si quieres que te borren. getPedirLiberacion()
    • Y te has borrado correctamente. && aux->liberar()
  • La función erase() borra a lo que apunta el iterador y automaticamente te avanza el iterador, teniendo siempre un iterador válido. Por eso el i++ esta en el else, si lo pusioramos fuera nos saltariamos un elemento de la lista cada vez que borremos.

GTA IV : «Es agradable comprobar que aún quedan estúpidos que pagan»

Gran deceptción con el GTAIV para PC debido al pobrísimo rendimiento y a la falta de interes de Rockstar por la plataforma PC. He comprado 2 GTAIV y de hecho 1 de ellos sigue precintado, debido al rendimiento que hemos visto con el primero.

La realidad es que Rockstar nos ha tomado el pelo, ellos ven la plataforma PC olvidada y muerta, saben que van a vender en PC pero inviertiendo lo mínimo imprescindible. Sus directivos no tienen gran visión.

Esto lo digo en base a que he leido que se ha encontrado en el libro donde se describen los lugares de interés de Liberty City (en el cyber debe ser), donde dicen que aparece esta frase:

Es agradable comprobar que aún quedan estúpidos que pagan cuando pueden obtener todo el contenido gratis en Internet. La red ha arruinado en gran medida nuestro modelo comercial, y mi casa de vacaciones en Carraways.

Fuente :
http://www.theinquirer.es/2008/12/06/gta-iv-es-agradable-comprobar-que-aun-quedan-estupidos-que-pagan.html

31 Personajes de videojuegos «reales»

Peligro: Este post tiene alto contenido geek
He encontrado un post por halloween con 31 imagenes(dia 31 y tal) de gente que se disfraza de protagonistas de juegazos :P. Os pongo 3 de ejemplo, dejo el link al final.

Fuente:
http://www.slobsofgaming.com/article/104754/31-amazing-video-game-costumes/

GetDeb se especializa: repositorio de juegos PlayDeb

Llevamos tiempo disfrutando de los repositorios de GetDeb pero según pone en el blog de getdeb , se ha creado el proyecto playdeb, que tratara de centrarse exclusivamente en ser el principal repositorio de juegos de ubuntu.
– Para instalar el repositorio sólo hay que ir a Sistema -> Administración -> Orígenes del Software y en la pestaña de Software de terceros hacer click sobre Añadir y pegar la siguiente línea:

deb mirror://www.getdeb.net/playdeb-mirror/hardy/// hardy/

Una vez recargada la lista, desde el Menú principal -> Añadir y quitar se puede acceder a todos los juegos e instalarlos cómodamente.
Otra forma es ir a esta lista de juegos de PlayDeb y gracias al protocolo apt:// podemos instalar juegos con un simple click desde el hipervínculo.