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.

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

Arquitectura de memoria de la PPU.
Los datos gráficos se distribuyen entre estas regiones de memoria:
- 96 KB 16-bit VRAM (Video RAM): 64 KB almacenan fondos y 32 KB almacenan sprites.
- 1 KB 32-bit OAM (Object Attribute Memory): alberga hasta 128 entradas de sprite (no los gráficos, solo los índices y atributos). Como indica su amplio bus, la OAM está optimizada exclusivamente para un acceso rápido.
- 1 KB 16-bit PAL RAM (Palette RAM): contiene dos paletas grandes, una para fondos y otra para sprites. Cada paleta contiene 256 entradas de colores de 15 bits, donde el color
0equivale a transparente.
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

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

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

Estos dos bloques están reservados para los sprites.
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

Capa de fondo 3 (BG3). Esta capa en particular se desplazará horizontalmente en determinadas líneas de escaneo para simular efectos de agua.
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 :
- Modo 0: proporciona cuatro capas estáticas.
- Modo 1: solo hay tres capas disponibles, aunque una de ellas es afín (puede girarse o escalarse).
- Modo 2: suministra dos capas afines.
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
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:
- Atributos: incluyen posición x e y, inversión horizontal y vertical, tamaño, forma (cuadrado o rectángulo), tipo de sprite (afín o regular) y la ubicación del primer tile.
- Datos afines: solo se necesitan para sprites afines. Especifican el escalado y la rotación .
- Con el escalado, los sprites pueden llegar a ocupar hasta 128×128 píxeles en pantalla.
Resultado

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 :
- Mosaico: hace que los tiles parezcan más pixelados.
- Fusión de color: combina los colores de dos grupos de capas superpuestas. La opacidad de cada grupo puede controlarse para lograr distintos grados de transparencia. Alternativamente, el segundo grupo puede fijarse en negro o blanco sólido, produciendo efectos de fundido.
- Ventanas: divide la pantalla en tres áreas rectangulares separadas (llamadas 'ventanas'). Estas pueden solaparse, y cada una tiene sus propios gráficos y controles de fusión. Dos ventanas tienen posición programable, mientras que la tercera es el complemento de las dos primeras (es decir, el resto de la pantalla no cubierto por ellas).
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:
- Comandar la CPU: el procesador tiene ahora acceso completo a la VRAM en cualquier momento. Sin embargo, puede producir artefactos no deseados si altera datos a mitad de frame, por lo que esperar al VBlank/HBlank (la forma tradicional) sigue siendo la opción más segura en la mayoría de los casos.
- Usar el Controlador DMA: el DMA ofrece tasas de transferencia unas diez veces más rápidas y puede programarse durante el VBlank y el HBlank. Esta consola dispone de cuatro canales DMA (dos reservados para sonido, uno para operaciones críticas y otro de propósito general). Ten en cuenta que el controlador detiene la CPU durante la operación, aunque si se usa correctamente, la CPU apenas lo notará.
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 :
- Modo 3: asigna un único frame a todo color (16 bpp, 32.768 colores).
- Modo 4: proporciona dos frames, cada uno con la mitad de profundidad de color (8 bpp, 256 colores).
- Modo 5: ofrece dos frames a todo color con la mitad de tamaño cada uno (160×128 píxeles).
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.

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).

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

SpongeBob SquarePants de Nickelodeon (distribuido como cartucho GBA Video). Para adaptarse al medio, sufrió una fuerte compresión.
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:
- Por ejemplo, un flag dentro del registro
DISPCNT(que afecta al controlador LCD) habilita un modo denominado 'green swap' . Al activarlo, el controlador de pantalla intercambia el canal verde de pares de píxeles contiguos. No queda claro por qué Nintendo implementó esto. - Para añadir más misterio, activar green swap también desbloquea otros flags en los mapas de fondos y sprites. Estos instruyen a la PPU para que renderice únicamente las columnas pares o impares de cada mapa .
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.

