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