« Game Boy Advance Architecture (index)

Game Boy Advance Architecture

Chapter 4: Graphics


Table of Contents

  1. Organising the content
  2. Constructing the frame
    1. Tiles
    2. Backgrounds
    3. Sprites
    4. Result
  3. Beyond Tiles
    1. Hidden capabilities

Before we begin, you'll find the graphics capabilities to be a blend of Super Nintendo and Game Boy elements. In fact, the new graphics core is still called Picture Processing Unit (PPU). Thus, I recommend reading those articles first, as I will be revisiting many previously explained concepts.

Image
Comparison of screen resolution and aspect ratio between the Game Boy and Game Boy Advance series.

Compared to previous Game Boys, we now have an LCD screen with a richer colour gamut, capable of displaying up to 32,768 colours (15-bit). It features a resolution of 240 x 160 pixels (giving games a 'wide-screen' look) and a refresh rate of ~60 Hz. I wonder if the new aspect ratio was directed towards benefiting platform games.

Organising the content

Image
Memory architecture of the PPU.

Graphics data is distributed across these memory regions:

Constructing the frame

If you've read the previous articles, you'll find the GBA familiar, although there is additional functionality that may surprise you. Regardless, the fact the new system operates on just two AA batteries makes this study even more enthralling.

Now I'm going to borrow the graphics of Sega's Sonic Advance 3 to show how a frame is composed.

Tiles

Image
These two blocks are made of 4 bpp tiles.

Image
You may notice some weird vertical patterns in here, these are not graphics but 'Tile Maps' (explained in the next section).

Image
These two blocks are reserved for sprites.

Pairs of charblocks found in VRAM.

GBA's tiles are still 8 x 8 pixel bitmaps, but they can now use either 16 colours (4 bpp) or 256 colours (8 bpp). 4 bpp tiles consume 32 bytes, while 8 bpp ones take 64 bytes.

Tiles can be stored anywhere in VRAM. However, the PPU expects them to be grouped into charblocks - continuous regions of 16 KB. Each charblock is reserved for a specific type of layer (either background or sprites), and programmers decide where each charblock begins. This can result in some overlapping, which in turn enables two charblocks to share the same tiles.

Due to the size of a charblock, up to 256 8 bpp tiles or 512 4 bpp tiles can be stored per block. Overall, up to six charblocks can be allocated, which combined require 96 KB of memory - the exact amount of VRAM this console has.

Finally, only four charblocks can be used for backgrounds, while two may be used for sprites.

Backgrounds

Image
Background Layer 0 (BG0).

Image
Background Layer 2 (BG2).

Image
Background Layer 3 (BG3). This particular layer will be shifted horizontally at certain scan-lines to simulate water effects.

Static background layers in use.

The background layer of this system has seen significant improvements since the Game Boy Color. It finally incorporates some features previously found in the Super Nintendo (remember affine transformations?).

The PPU can draw up to four background layers. The capabilities of each one will depend on the selected mode of operation :

Each layer has a dimension of up to 512 x 512 pixels. For affine layers, this extends to a maximum of 1024 x 1024 pixels.

The piece of data that defines the background layer is still called Tile Map. That said, this information is now encoded in the form of screenblocks - structures that define portions of the background layer (32 x 32 tiles). A single screenblock occupies just 2 KB, though multiple are needed to construct the whole layer. Programmers may place screenblocks anywhere in VRAM, potentially overlapping background charblocks (where tiles reside). This means that not all tile entries contain graphics!

Sprites

Image
Rendered sprite layer.

A sprite can be up to 64 x 64 pixels in size. Yet, considering the 240 x 160-pixel screen, sprites will end up occupying a significant part of it.

As if that weren't enough, the PPU can now apply affine transformations to sprites! Specifically, rotation and scaling.

Sprite entries are 32-bit wide and their properties are divided into two groups:

Result

Image
All layers merged (Tada!).

As always, the PPU combines and outputs all layers automatically, but it's not over yet! The system provides plenty of effects to apply to these layers :

I have to say, these are strongly reminiscent of the Super Nintendo era.

Similarly, to update the frame, there are multiple options available:

Beyond Tiles

Sometimes, game artists may design a background for which the tile engine can't draw all required graphics. Now, modern consoles addressed this by implementing a frame-buffer architecture, enabling programmers to arbitrarily alter each pixel individually. However, this is not possible when there's very little memory... Well, the GBA happens to house 96 KB of VRAM. This is enough to allocate a bitmap matching the dimensions of the LCD screen.

The good news is that the PPU actually implemented this functionality by including three extra modes, these are called bitmap modes :

The reason for offering two bitmaps is to enable page-flipping: drawing over a displayed bitmap can expose unwanted artefacts during the process. If the CPU instead manipulates a secondary bitmap, none of the glitches will be visible to the user. Once the second bitmap is finished, the PPU can be updated to point to it, effectively swapping the displayed frame.

Image
Super Monkey Ball Jr. (2002). Bitmap mode allowed the CPU to render rudimentary 3D graphics for the scenery, while foreground objects were handled as sprites (a separate layer).

Image
Tonc's bitmap demo (Homebrew). Notice that the screen doesn't show the typical patterns produced by tile engines.

Image
Nickelodeon's SpongeBob SquarePants (distributed as a GBA Video cartridge). To fit the medium, it underwent heavy compression.

Examples of programs using bitmap modes.

Overall, this sounds like a cutting-edge feature; however, most games held on to the tile engine. Why? Because in practice bitmaps cost a lot of CPU resources.

You see, the tile engine enables the CPU to delegate most computations to the graphics chip. By contrast, the frame-buffer system provided by the PPU is limited to only displaying that segment of memory as a single background layer, which means no more individual affine transformations, layering, or effects unless the CPU computes them. Additionally, the frame-buffer occupies 80 KB of memory, leaving only 16 KB (half) available to store sprite tiles.

For this reason, these new modes were predominantly useful in exceptional cases, such as playing motion video (the Game Boy Advance Video series relied completely on this) or displaying 3D geometry (rendered by the CPU). In any case, the results were undeniably impressive.

Hidden capabilities

That's as far as the official perks go, but in the undocumented realm, there are obscure controls left installed that suggest additional, perhaps at one point envisioned, capabilities of the Game Boy Advance:

All in all, these appear to be pieces of a large puzzle, perhaps aimed at implementing a stereoscopic function that was abandoned halfway through. Be that as it may, a previous interview with Satoru Iwata suggests that the Game Boy Advance SP was originally planned to bundle a stereoscopic screen , but the loss in display resolution delayed the plan until the arrival of the Nintendo 3DS, eight years later.


Previous: 3. CPU

Next: 5. Audio


Rodrigo Copetti © 2026 RSS Feed

Switch to modern edition

Home · Writings · Support · About author · About website