El hardware de la NES. Capítulo II: El funcionamiento de la PPU
Posiblemente una de las grandes incógnitas que guarda la NES dentro de sus tripas sea el cómo gestiona los recursos gráficos con los cuales fue diseñada, en un época donde la tecnología estaba viviendo el inicio de una nueva era de la información pero cuyos recursos eran todavía muy caros y se necesitaba de mucho ingenio para aprovechar al máximo de lo que se disponía a un coste razonable. Este es el caso de la PPU de la NES: básica pero enormemente funcional.
La PPU o Picture Processing Unit (Unidad de Procesamiento de Imagen) es un chip integrado que actúa como "tarjeta gráfica" en la NES y que tiene una capacidad de 2 kb de RAM. Ya he comentado en el anterior artículo sus bondades: Es capaz de paginar de golpe 512 tiles (8 kb en formato ROM o RAM). Estos están divididos en dos bancos de memoria: un banco de 256 tiles para los background (los fondos, escenarios, etc...) y otro para los sprites que formemos (figuras del juego). Cada tile puede ser de 8x8 o de 8x16 pixeles. Normalmente se usa la primera opción, y rara vez la segunda.
Cuando conectamos nuestros cartuchos en la NES, el chip CHR que se encarga de guardar nuestros gráficos, se conecta directamente con la PPU. Los 8 Kb que contiene el CHR se van paginando, según necesidades, sobre los 2 kb de la PPU para que esta pueda procesar lo que necesitemos en ese instante y de esta forma, mediante orden de la CPU, se muestran en pantalla.
TILES Y SPRITES
Un tile o varios tiles juntos forman los sprites, aunque algunas personas llaman directamente a los tiles como sprites y al conjunto de tiles como metasprites. Es lo mismo.
La PPU de la NES tiene la capacidad de poner 64 sprites en pantalla, pero no puede haber más de 8 tiles en la misma linea de muestreo de la pantalla, así que los sprites que formamos pueden ser compuestos como mínimo de 1 tile, pero no de más de 8 tiles de ancho. Si tal cosa ocurriese, los siguientes sprites no se verían y permanecerían invisibles.
Más de 8 tiles en linea da como resultado parpadeos o directamente tiles invisibles
Gracias a los sprites podemos ver al personaje que controlamos en el videojuego, los enemigos, objetos, etc... No es obligatorio que sea así, pero digamos que es lo más normal.
Por ejemplo, estos son todos los tiles y paletas de colores que necesita Super Marío Bros. para formar el componente gráfico del videojuego.
- El banco de la izquierda muestra los tiles necesarios para hacer los sprites de Mario, Luigi, enemigos, objetos, etc...
- El banco de la derecha muestra los tiles necesarios para hacer los background de los niveles.
- La primera fila de colores muestra 4 paletas de 1+3 colores para usar en los background y la segunda fila de colores muestra otras 4 paletas de 1+3 colores correspondientes para usar en los sprites.
Como podéis observar, el primer color de cada paleta es el color azul (en este caso). Ese primer color se comparte obligatoriamente en todas las demás, por eso hablamos de paletas de 1+3 colores a elegir. Ese color marca el color de fondo total que tendrá la pantalla donde estemos y se le suele llamar backdrop. Sin embargo, para los sprites, ese primer color se ignora y simplemente es transparente. Así pues, realmente los background y sprites juegan con tres colores por paleta, solo que los background lo interpretan como color y los sprites como invisible. La imagen resultante da una solución como esta:
El caso de Super Mario Bros. es el típico donde sus sprites están formados por tiles de 8x8. La mayoría de los juegos de NES usan ese formato, pero hay muchos otros que utilizaron la opción de 8x16 tiles. La ventaja de esta otra opción es que puede ayudarnos a crear sprites resultantes más grandes sin que lleguemos a superar la barrera de los 64 sprites en pantalla y de esta forma poder mostrar muchos personajes en pantalla. La desventaja de esto es que si en un principio, en nuestro banco de memoria tenemos 256 tiles de 8x8, estos se verán reducidos a 128 tiles de 8x16 con lo cual perderíamos detalle a la hora de crear muchos sprites distintos. Un ejemplo de esto sería el caso del videojuego Teenage Mutant Ninja Turtles que lanzó Konami en 1989:
Tiles 8x8 en Blaster Master VS. tiles 8x16 en TMNT (animación cedida por Brad Smith)
Como podéis ver, si se hubiese usado una configuración de 8x8 tiles, se consumirían muchos recursos y puede que al poner diferentes enemigos u objetos en pantalla, se superase el límite de 64 sprites, con el eventual problema añadido de hacer calcular a la CPU la posición de todos estos, que daría como resultado un videojuego lento e inestable.
Al poner una configuración de 8x16 tiles, aprovechamos recursos aunque también perdemos otras ventajas e incluso puede que algunos tiles desperdicien mucho espacio, como pueden ser en este caso la cabeza superior de la tortuga Leonardo. Como ya digo, esta elección se hace al inicio del desarrollo del videojuego, dado que no se puede cambiar en cualquier momento, por tanto, es necesario tener muy claro el diseño del mismo sobre el papel ya desde un inicio.
Sea como sea, esta es la herramienta básica para poder poner sprites en pantalla. Una de las características más reconocidas de esta PPU es la de poder hacer mirroring en los sprites. Esto significa que un tile, cual sea, se puede espejar e incluso rotar en posición, de tal forma que no nos hace falta dibujar nuestro sprite mirando hacia todas las direcciones; simplemente se le añade el atributo que espeja o rota y listo (normalmente un bit en la cadena hexadecimal que crea el tile, basta para esto). Una forma muy loable de ahorrar recursos.
Un mismo sprite, cuatro posiciones diferentes, cero recursos consumidos
BACKGROUNDS, FONDOS Y PRIORIDADES
Los background o fondos que componen la pantalla del juego se forman con la otra tabla de 256 tiles que tenemos. Aquí, el color que comparten las cuatro paletas si es visible, a este se le asigna la posición backdrop y normalmente se elige un color que sea muy frecuente en el juego, para ahorrar trabajo.
Los tiles del background, no guardan información del color, si no que guardan la posición de color según paleta y su correspondiente atributo. La tabla de atributos que componen los background que dan color a estos mapas están limitados a 16x16 pixeles. Lo que quiere decir que en un área de 16x16 pixeles solo se puede usar una misma paleta. Estos atributos se ponen por debajo de los tiles que componen el background y de esta forma colorean el escenario.
The Banketh - The Video Game [RetroNES Software] (2016)
La ventaja con esta técnica es que un mismo tile o conjunto de tiles nos pueden servir para crear diferentes imágenes sin malgastar recursos (recordad que solo tenemos 256 tiles). De esta forma, el tile que usamos para representar arena, también nos puede valer para representar agua, simplemente cambiándole el atributo de color a la hora de componer el background final; de colores amarillentos a colores azulados.
El inconveniente radica en que como los atributos están limitados a un espacio de 16x16, podemos tener el problema de que el background parezca que tenga pocos colores. Hay que ser muy buen grafista para sacar partido a este arte.
De esta forma, una pantalla de cualquier juego de NES se forma de esta manera:
- Backdrop al fondo del todo, que es el color que se comparte.
- Sprites de baja prioridad (esto se configura).
- Background (el fondo en si formado por tiles).
- Sprites de alta prioridad (esto se configura).
Como podéis ver, podemos asignar a los sprites si estos tienen que ser de baja o alta prioridad. Esto nos puede ser muy útil para explicar al programa si estos deben aparecer encima o detrás del escenario. Nos amplia posibilidades y nuevas formas de juego que muchos ya explotaron en su día. Un ejemplo claro lo tenemos con SMB. 3:
¡Hop! ahora no me ves
En cualquier momento, nuestros sprites pueden tener una prioridad alta, con lo cual estarán por encima del escenario, o baja, con lo cual pasarían por detrás de este y solo serian visibles cuando ocupan el espacio cubierto por el color compartido en la tabla de atributos del background. En el caso de Super Mario Bros. 3, cuando Mario pasa a tener una prioridad baja, solo se le podría ver cuando esta sobre los atributos con el color azul del cielo, que es el color compartido en la paleta de este background.
Estos son los concepto mínimos para entender como funciona el procesador gráfico de la NES. Para muchos os será de mucha ayuda a la hora de entender como funcionaba esta máquina. Para otros incluso os resulte de gran utilidad si queréis meteros en el mundillo homebrew. Sea como sea, seguro que para la mayoría os resulta cuanto menos curioso.
- Inicie sesión para comentar