Skip to content

Tile(图块)

是什么

Tile(图块)是 GBA 图形系统的基本渲染单元,大小固定为 8×8 像素。GBA 的字符模式(Mode 0-2)下,所有背景和精灵的图形都由图块组合而成。图块数据存储在 VRAM 中,可以被背景映射表和 OAM 引用。

每个图块支持两种色深模式:

  • 4bpp(16 色):每个像素用 4 位表示,一个字节存储 2 个像素,一个图块占 32 字节。
  • 8bpp(256 色):每个像素用 8 位表示,一个字节存储 1 个像素,一个图块占 64 字节。

为什么需要

图块是 GBA 图形管线的基础概念。理解图块的编码方式对于在浏览器中正确还原画面至关重要:

  • 数据解码:VRAM 中存储的是压缩的索引色数据,需要按图块格式正确解码。
  • 内存对齐:图块在 VRAM 中按固定偏移排列,图块索引乘以图块大小即可得到地址。
  • 背景和精灵共享机制:背景和精灵都使用图块作为基本单位,但引用方式不同。

原理与实现

图块在内存中的排列

图块在 VRAM 中按 8×8 像素块连续排列。每个图块的像素按行优先顺序存储:

4bpp 模式(32 字节/图块):
Byte 0: Pixel[0,0] 低4位 | Pixel[1,0] 高4位
Byte 1: Pixel[2,0] 低4位 | Pixel[3,0] 高4位
...
Byte 31: Pixel[6,7] 低4位 | Pixel[7,7] 高4位

8bpp 模式(64 字节/图块):
Byte 0: Pixel[0,0]
Byte 1: Pixel[1,0]
...
Byte 63: Pixel[7,7]

图块索引与地址计算

  • 背景图块:地址 = VRAM 基地址 + 图块索引 × 图块字节数(4bpp 时 × 32,8bpp 时 × 64)。
  • 精灵图块:在 VRAM 的 OBJ 区域(通常从 0x06010000 开始),地址计算方式与背景相同,但 4bpp 模式下图块索引以 32 字节为单位。

图块组合

较大的图形(如 16×16 的精灵)由多个图块按特定排列组合而成:

  • 精灵:按行优先排列(如 16×16 精灵 = 2×2 个图块,排列为 [0,1],[2,3])。
  • 背景:通过映射表(Screen Base Block)指定每个 8×8 位置使用哪个图块及如何翻转。

在 pokeemerald-wasm 中的实现

在 pokeemerald-wasm 项目中,图块的解码流程为:

  1. 读取图块索引:从 OAM(精灵)或背景映射表(背景)获取图块索引号。
  2. 计算 VRAM 地址:根据索引号和色深模式计算图块数据在 Wasm 线性内存中的偏移地址。
  3. 逐像素解码:读取图块的每个字节,拆分为 4 位或 8 位的颜色索引值。
  4. 查调色板:将颜色索引值传入调色板(Palette)查找表,获取 BGR555 格式的颜色值。
  5. 格式转换:将 BGR555 转换为 RGBA8888 格式,写入 Canvas 的 ImageData 缓冲区。

相关概念

  • VRAM — 存储图块数据的 96KB 显存
  • Sprite — 由图块组合而成的可移动图形对象
  • Palette — 将图块中的颜色索引转换为实际颜色的查找表