20 mar 2007

Vuelta a los orígenes

En fin, se veía venir. Hoy he instalado todo lo necesario para trabajar con XNA, y le he dado una segunda oportunidad.

Lo primero fue conseguir una pantalla en blanco, cosa realmente sencilla porque el proyecto base ya trae lo necesario (aunque en el Swift era todavía más simple :p).

Tras ello, el siguiente paso era dibujar un sprite en pantalla. Para eso, XNA incluye una potente clase llamada SpriteBatch, que permite lo que su nombre indica: Realizar un proceso batch de sprites en dos dimensiones, para dibujarlas después lo más rápido posible: Se pueden ordenar esos sprites para evitar problemas de alpha, o para minimizar el número de cambios de textura. También se permiten rotaciones y escalados, lo cual le proporciona toda la funcionalidad que hace falta para manejar sprites en 2D... siempre que usen una sola textura. Por ejemplo, para hacer tiles no creo que haya nada mucho más eficiente (habría que entrar ya en temas de no dibujar lo que no se va a ver y tal).

Rápidamente me programé un ejemplillo que, apretando una tecla, dibujaba más y más sprites en pantalla. El problema: ¿Cómo sabía cuantos sprites se estaban dibujando?

Así que lo siguiente fue mostrar texto en pantalla. Y, ay, esto ya resultó más complicado. Me explico:

XNA no incluye el soporte que traía MDX (y Direct3DX) para mostrar fuentes del sistema en la aplicación. Me imagino que tiene que ver con cierto aparatejo blanco. Y tampoco trae soporte para fuentes de tipo bitmap. Pero en fin, tras poco buscar encontré un pequeño paquete de clases entre las que se incluye un BitmapFont*.

Generar las fuentes fue un poco engorroso, puesto que no me valían las que llevo usando desde el Little Racers: Hace falta, además de la textura, un bonito archivo .xml que incluye la posición, tamaño, etc. de cada caracter disponible en la textura. Lo cual está muy bien, pero hay que hacerlo. Y además, tras generarlas, tampoco pude probarlas directamente porque resulta que si se genera una textura de 512 (quería una textura detallada para el texto), la estructura que usa el código utiliza datos de tipo byte, así que hale, a modificar código ajeno**...

En fin, tras pitos y flautas, conseguí la mierda que a continuación se muestra:


Descripción del barullo:
* 970 sprites (mas los 12 del texto, 982) dibujándose por frame.
* Todos usan la misma textura, de 256x256
* Resolución de 1280x1024
* Escalados a un octavo del tamaño de la textura original, es decir a 32x32 pixels.
* Vsync desactivado
* No se borra en la pantalla en cada frame
* Un total de 75fps.

En pruebas posteriores, obtuve resultados similares, por ejemplo 1020 sprites utilizando dos texturas de forma aleatoria, en vez de una (lo cual significa que funciona mejor!?

En resumen, que es posible hacer cosas en XNA (habrá que ver qué tal se porta cuando lleguemos al tema de Shaders), y que os vais a encontrar muchos enemigos en el Eternal Showdown :)




*: También se incluye un gestor de sprites con soporte para animación, al que le echaré un ojo más adelante.
**: Estuve por poner un comentario al respecto en la página de origen, pero estaban deshabilitados. La fecha de esa página data del 2006, es posible que exista una versión más moderna :\

No hay comentarios: