Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Tiles y Sprites en Ensamblador

–Elementos Gráficos Básicos de los Videojuegos–

De momento voy a evitar hablar de “lo sucedido en 2010” para irme directo a la programación. Esta vez se va a tratar el tema de los sprites y los tiles. Imagino que todos los lectores saben bien lo que es un pixel y que estos forman las imágenes desplegadas en la mayoría de las computadoras actuales. Los pixeles se agrupan en matrices rectangulares para representar imágenes como fotografías, avatares de los foros de discusión, letras en pantalla y en el caso de los videojuegos cualquier elemento gráfico bidimensional. Lo que muy pocos saben (incluso muchos desarrolladores “profesionales”) es como se representan estos dentro de la computadora.

Para empezar, las computadoras actuales usan una zona de la memoria, que puede ser una parte de la RAM principal o un circuito de memoria
independiente para guardar la información de la pantalla. Esta zona de la memoria se maneja de la misma manera que un array en cualquier lenguaje. La posición inicial u offset de este arrray coincide con la memoria de video y sus elementos representan los pixeles. Existen muchos tipos diferentes de codificación pero el mas popular es el conocido como Packed Pixel donde cada pixel se representa como un entero binario cuya longitud depende de la profundidad de color. Por ejemplo si estamos en un modo de video de 640 x 480 a 256 colores tenemos un array de bytes de 307,200 elementos. Si la profundidad de color es de 16 bits entonces tendriamos 307,200 * 2 = 614,400 y podríamos representar poco mas de 65,000 colores.

En este caso vamos a trabajar con una profundidad de 24 bits por pixel que es mas que suficiente para desplegar sprites de calidad fotográfica pero por razones de performance cada pixel en pantalla va a ocupar 32 bits. Lo que significa que los 8 bits mas altos del Double Word pueden usarse para otra cosa como por ejemplo transparencia. Estos bits sin uso directo es lo que se denomina Canal Alfa.

La RAM no es Bidimensional

El primer problema al que nos enfrentamos cuando comenzamos con los sprites es que estos son bidimensionales pero la memoria es lineal. En la imagen de este párrafo se muestra el mismo sprite del inicio del artículo pintado en una sola linea de 16 pixeles en lugar de un cuadrado de 4 por 4. Esta es la imagen que obtendríamos si tan solo copiáramos los datos del sprite directamente en la RAM de video. La primera pregunta es como demonios hacemos para escribir en el siguiente renglón. Aquí es donde entra el concepto de PITCH (con P). Pitch es un valor entero que hay que sumarle a la posición en memoria de un pixel para obtener la posición de memoria del pixel que se encuentra directamente debajo del pixel que le sigue.Piensen en un automovil que cambia de carril mas que en un objeto que cae. Si quisiéramos obtener la posición del pixel que está por encima del actual restamos a la dirección actual ese mismo valor Pitch. Normalmente se elige como valor Pitch el ancho de la pantalla en pixeles multiplicado por la cantidad de bytes que se necesitan para la profundidad de color, Algunos sistemas de video tienen valores de Pitch que siempre son potencias de dos, lo que permite que el cálculo de la posición del pixel a partir de sus coordenadas X,Y se reduzca a unos cuantos desplazamientos binarios; lo malo es que esto puede hacer que el extremo derecho de la pantalla no coincida con el teórico extremo derecho de la ram de video, por lo que quedaría una sección de la memoria de video que quedaría fuera de la pantalla.

Newfags Can’t Pitch

Cuando a estamos escribiendo un renglón de pixeles y queremos pasar al siguiente tan solo sumando al registro apuntador el valor Pitch la escritura sigue en el renglón siguiente. Si no tomamos en cuenta que los sprites también tienen su propio pitch el resultado va a ser el que se muestra en esta imagen. Para obtener el valor que hay que sumarle al final de un renglón de un sprite para llegar al inicio del renglón siguiente, al Pitch hay que restarle el ancho que el sprite ocupa en memoria cantidad de pixeles multiplicado por los bytes por pixel. Esta suma no tiene que hacerse cada vez, si el sprite es cuadrado puede calcularse este valor una sola vez cuando se va a dibujar el sprite o bien puede ser un valor constante en caso de que todos los sprites sean del mismo tamaño y no haya grandes cambios en la resolución de pantalla.

Diferencia entre Tiles y Sprites

Un Tile (traducido al castellano como azulejo) es un caso particular de sprite que es completamente cuadrado, no tiene huecos ni partes transparentes y se usa en combinación con otros tiles para construir grandes mundos usando muy poca memoria. Algunos tilesets (conjuntos de tiles con los que se construyen los escenarios) están tan bien elaborados que es dificil identificar las uniones entre ellos y dan la apariencia de tratarse de un dibujo continuo. Las particularidades mencionadas al principio del párrafo hacen que dibujar un tile en pantalla sea mucho mas rápido que un sprite normal, esto es necesario porque la mayor parte del tiempo la cantidad de tiles está muy por encima de la de sprites. En la imagen de este párrafo se muestra un ejemplo bastante modesto de como los tiles pueden usarse para construir una imagen mas grande.

Antes de terminar esta nota quisiera dejar claro porqué los tiles son mucho mas rápidos de dibujar que los sprites. La primera razón es porque al no tener partes transparentes simplemente pueden escribirse directo a memoria y el CPU cuenta con instrucciones especiales que pueden copiar renglones enteros de un solo golpe. La segunda es que esta velocidad es necesaria porque la cantidad de tiles en una toma supera por mucho a la cantidad que existe de sprites y tercero porque los tiles no solo sirven para las imágenes en primer plano sino también para el fondo. Respecto al minijuego el siguiente punto debe de ser hacer la animación cíclica. He tenido algunas dificultades con el frame buffer que explicaré en otra ocasión. Por ahora mejor sigo programando y con un poco mas de esfuerzo ya tenga por lo menos una pantalla jugable para fin de mes.

marzo 11, 2011 - Posted by | Uncategorized | , ,

1 comentario »

  1. impresionante tu trabajo.. no se como es que sabes tanto jeje fuerza con el juego ammigo..

    Comentario por pavon | marzo 12, 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: