« Arquitectura Game Boy Advance (index)

Arquitectura Game Boy Advance

Chapter 4: Gráficos


Tabla de contenidos

  1. Organizando el contenido
  2. Construyendo el frame
    1. Mosaicos
    2. Fondos
    3. Sprites
    4. Resultado
  3. Más allá de los mosaicos
    1. Capacidades ocultas

Antes de entrar en materia, conviene saber que las capacidades gráficas son una mezcla de elementos de la Super Nintendo y la Game Boy. De hecho, el nuevo núcleo gráfico sigue llamándose PPU. Por ello, recomiendo leer esos artículos antes de continuar, ya que retomaré muchos conceptos explicados anteriormente.

Image
Comparación de resolución de pantalla y relación de aspecto entre la serie Game Boy y la Game Boy Advance.

En comparación con las anteriores Game Boy, ahora disponemos de una pantalla LCD con una gama de colores más rica, capaz de mostrar hasta 32.768 colores (15 bits). Tiene una resolución de 240 × 160 píxeles (lo que da a los juegos un aspecto panorámico) y una frecuencia de actualización de ~60 Hz. Me pregunto si la nueva relación de aspecto fue una decisión pensada para favorecer los juegos de plataformas.

Organizando el contenido

Image
Arquitectura de memoria de la PPU.

Los datos gráficos se distribuyen entre estas regiones de memoria:

Construyendo el frame

Si has leído los artículos anteriores, la GBA te resultará familiar, aunque hay funciones adicionales que pueden sorprenderte. En cualquier caso, el hecho de que este nuevo sistema funcione con solo dos pilas AA hace que su estudio resulte aún más fascinante.

Tomaré prestados los gráficos de Sonic Advance 3 de Sega para mostrar cómo se compone un frame.

Mosaicos

Image
Estos dos bloques están formados por tiles de 4 bpp.

Image
Puede que notes algunos patrones verticales extraños aquí; no son gráficos sino 'Tile Maps' (explicados en la siguiente sección).

Image
Estos dos bloques están reservados para los sprites.

Pares de charblocks encontrados en la VRAM.

Los tiles de la GBA siguen siendo bitmaps de 8×8 píxeles, pero ahora pueden usar 16 colores (4 bpp) o 256 colores (8 bpp). Los tiles de 4 bpp consumen 32 bytes, mientras que los de 8 bpp consumen 64 bytes.

Los tiles pueden almacenarse en cualquier lugar de la VRAM. Sin embargo, la PPU espera que estén agrupados en charblocks — regiones continuas de 16 KB. Cada charblock está reservado para un tipo específico de capa (fondo o sprites), y los programadores deciden dónde empieza cada uno. Esto puede dar lugar a cierto solapamiento que, a su vez, permite que dos charblocks compartan los mismos tiles.

Dado el tamaño de un charblock, se pueden almacenar hasta 256 tiles de 8 bpp o 512 tiles de 4 bpp por bloque. En total, se pueden asignar hasta seis charblocks, que en conjunto requieren 96 KB de memoria — exactamente la cantidad de VRAM que tiene esta consola.

Por último, solo cuatro charblocks pueden usarse para fondos, mientras que dos quedan reservados para sprites.

Fondos

Image
Capa de fondo 0 (BG0).

Image
Capa de fondo 2 (BG2).

Image
Capa de fondo 3 (BG3). Esta capa en particular se desplazará horizontalmente en determinadas líneas de escaneo para simular efectos de agua.

Capas de fondo estático en uso.

La capa de fondo de este sistema ha mejorado notablemente desde la Game Boy Color. Por fin incluye algunas características encontradas en la Super Nintendo (¿recuerdas las transformaciones afines?).

La PPU puede dibujar hasta cuatro capas de fondo. Las capacidades de cada una dependerán del modo de funcionamiento seleccionado :

Cada capa tiene una dimensión de hasta 512×512 píxeles. En caso de ser afín, la dimensión máxima es de 1024×1024 píxeles.

La estructura de datos que define la capa de fondo sigue llamándose Tile Map. Ahora bien, esta información se codifica en forma de screenblocks — estructuras que definen porciones de la capa de fondo (32×32 tiles). Un screenblock ocupa solo 2 KB, aunque se necesitarán varios para construir toda la capa. Los programadores pueden colocarlos en cualquier lugar de la VRAM, potencialmente solapándolos con los charblocks de fondo donde residen los tiles. Esto significa que ¡no todas las entradas de tiles contendrán gráficos!

Sprites

Image
Capa de sprites renderizada.

Un sprite puede tener hasta 64×64 píxeles. Sin embargo, teniendo en cuenta la pantalla de 240×160 píxeles, acabarán ocupando una parte considerable de ella.

¡Por si fuera poco, la PPU ahora puede aplicar transformaciones afines a los sprites! En concreto, rotación y escalado.

Las entradas del sprite tienen un ancho de 32 bits y sus propiedades se dividen en dos grupos:

Resultado

Image
Todas las capas combinadas (¡Tachán!).

Como siempre, la PPU combina y renderiza todas las capas automáticamente, ¡pero aún no ha terminado! El sistema dispone de varios efectos para aplicar sobre estas capas :

Debo decir que estos efectos recuerdan mucho a los de la época de la Super Nintendo.

Del mismo modo, para actualizar el frame hay varias opciones disponibles:

Más allá de los mosaicos

A veces, los artistas diseñan un fondo cuyos gráficos el motor de tiles no puede dibujar en su totalidad. Las consolas modernas solucionaron esto implementando una arquitectura de frame buffer, lo que permite a los programadores alterar cada píxel de forma arbitraria e individual. Sin embargo, esto no es posible cuando hay muy poca RAM... Pues bien, resulta que la GBA tiene 96 KB de VRAM que son suficientes para asignar un bitmap con las dimensiones de nuestra pantalla LCD.

La buena noticia es que la PPU realmente implementó esta funcionalidad incluyendo tres modos extra, que se denominan modos bitmap :

La razón de ofrecer dos bitmaps es permitir la conmutación de páginas: modificar un bitmap mientras se está visualizando puede provocar artefactos no deseados. Si en su lugar la CPU manipula un segundo bitmap, ninguno de esos artefactos será visible al usuario. Una vez terminado, la PPU puede actualizarse para apuntar al segundo, intercambiando así el frame visualizado.

Image
Super Monkey Ball Jr. (2002). El modo bitmap permitía a la CPU renderizar gráficos 3D rudimentarios para los escenarios, mientras que los objetos en primer plano se gestionaban como sprites (una capa separada).

Image
Demo bitmap de Tonc (homebrew). Observa que la pantalla no muestra los patrones típicos producidos por los motores de tiles.

Image
SpongeBob SquarePants de Nickelodeon (distribuido como cartucho GBA Video). Para adaptarse al medio, sufrió una fuerte compresión.

Ejemplos de programas que utilizan modos bitmap.

En definitiva, parece una característica de vanguardia; sin embargo, la mayoría de los juegos se aferraron al motor de tiles. ¿Y por qué? Porque en la práctica los bitmaps consumen muchos recursos de CPU.

La CPU puede delegar la mayor parte de los cálculos en el chip gráfico. En cambio, el sistema de frame buffer que proporciona la PPU se limita a mostrar ese segmento de memoria como una única capa de fondo, lo que significa que se acabaron las transformaciones afines individuales, la superposición de capas o los efectos a menos que la CPU los compute. Además, el frame buffer ocupa 80 KB de memoria, por lo que solo 16 KB (la mitad) están disponibles para almacenar tiles de sprites.

Por esta razón, estos modos resultaron de utilidad principalmente en casos excepcionales, como reproducir vídeo en movimiento (la serie Game Boy Advance Video dependía completamente de esto) o mostrar geometría 3D renderizada por la CPU. En cualquier caso, los resultados fueron innegablemente impresionantes.

Capacidades ocultas

Hasta aquí llegan las prestaciones oficiales, pero en el terreno no documentado existen controles ocultos que quedaron instalados y sugieren capacidades adicionales de la Game Boy Advance, quizás concebidas en algún momento:

En conjunto, parecen piezas de un rompecabezas mayor, quizás orientado a implementar una función estereoscópica que quedó a medias. Sea como fuere, una entrevista anterior con Satoru Iwata sugiere que la Game Boy Advance SP se planeó en un principio con pantalla estereoscópica , pero la pérdida de resolución retrasó el plan hasta la llegada de la Nintendo 3DS, ocho años después.


Previous: 3. CPU

Next: 5. Audio


Rodrigo Copetti © 2026 RSS Feed

Ir a la edición moderna

Inicio · Escritos · Soporte · Acerca del autor · Acerca del sitio web