« Game Boy / Color 的架构 (index)

Game Boy / Color 的架构

Chapter 4: 图形


目录

  1. 硬件组织
  2. 构造帧
    1. 图块
    2. 背景层
    3. 窗口
    4. 精灵
    5. 结果
  3. 机密与限制
    1. 晃动效果
  4. 添加色彩
    1. 操作模式
    2. 整理(新)内容
      1. 视觉效果
      2. 额外的空间

所有的图形计算都由 CPU 完成,然后由 图形处理单元(PPU)进行渲染。 PPU 是 DMG-CPU 内部的另一个组件,可以说是 前代图形芯片(同名)的改进版。

图像显示在集成的 LED 屏幕上:它具有 160 x 144 的分辨率;在单色版本的 GameBoy 上,每个像素可呈现四种灰度(白、浅灰、深灰、黑)。 不过,因为原版 GameBoy 的 LED 屏幕呈绿色,实际看上去是 发绿 的。

如果您读过NES的文章,您或许会记得 PPU 是为 CRT 电子束设计的。 但很显然,GameBoy使用的是液晶屏幕。 不过,这颗新的 PPU 采用了同一种技术,因为液晶屏幕也是逐行刷新的。 如此一来,主机也有了 如同CRT一般的特效,让开发者能够尽情发挥自己的想象力。

硬件组织

Image
PPU的内存架构。

PPU 与一个 8 KB 的 VRAM 相连。 这样一来,PPU 就需要通过仲裁机制,从 CPU 手中拿过对内存的控制权。 这 8 KB 包含了PPU渲染图形所需的大部分数据。 其他的数据就直接储存在 PPU 中,因为它们需要更快的读取速率。

游戏负责在不同区域填充正确类型的数据。 此外,PPU公开了寄存器,因此游戏可以指示PPU如何组织数据。 尽管如此,仍有许多规则需要遵循(您将在以下章节中看到这些规则)。

构造帧

来看看 PPU 是如何在屏幕上渲染图像的。 为了演示,我用 Super Mario Land 2(超级马力欧大陆2 六个金币)作为例子。

图块

Image
多个图块

Image
被网格分隔的图块

Image
一个图块。

在图块表中找到的图块。

PPU 使用 图块(Tiles)作为渲染图形的基本元素 —— 更具体地说,是 精灵和背景

所谓"图块"就是一张 8x8 的位图,它存放于 VRAM 里一个叫 图块集(Tile set),或者叫"图块模式表"(Tile pattern table)的区域中,每个像素对应四种灰度的任意一种。 这里的"灰度"是通过"调色板"(colour palette)来选择的。 单色版本的 GameBoy 有一个定义这种调色板的寄存器, 正如我之前所说,它只能选择四种颜色(或者说"灰度"),所以使用 8 位的寄存器来储存这种调色板是完全没有问题的。 尽管如此,系统还是提供了 3 个寄存器(也就是 3 个可编程调色板),但它们的使用受到 限制(稍后再详细说明)。

此外,图块还被归类到两个图案表中。

为了构建图片,图块被引用到另一种称为图块映射的表中。 这些信息将告诉PPU在何处渲染图块。 存储的两个映射用于构建每一帧的不同层。

下一章节会解释如何用图块构建图层。

背景层

Image
VRAM中分配的背景图

Image
背景图上被选择的区域。 注意选中的部分包括顶部的一部分,这部分将被窗口图层重叠。

Image
显示的背景图。

背景图渲染过程

背景图层是包含 静态图块 的图,大小为 256x256 像素(32x32 图块)。 但是,请您注意,屏幕上只能看到 160x144 的范围。也就是说,游戏要决定背景的哪些部分需要显示。 于是,游戏可以在玩家游玩的过程中,移动要显示的背景区域。这就是 滚动效果 实现的原理。

两个图块映射中的一个可用于创建背景图层。 另外,背景图层只能使用 一个 调色板。

窗口

Image
已分配的窗口图

Image
显示的窗口图。 游戏会在最后一行扫描时激活它。 因此,屏幕底部只显示第一行。

窗口图渲染过程

"视窗"(windows)是一个 160x144 像素 的图层,包括显示在背景或精灵顶部的图块。 这个图层 不会 滚动。

剩下的图块可以分配给该图层;它们也可以与背景图层共用相同的调色板。

这个功能听上去很傻: 因为窗口图层没有透明度,它完全遮盖住了背景。您可能会想,"都遮住了还看个毛啊?" 嗯...... 其实视窗图层可以与背景 合用,分别显示屏幕的各部分。 该图层主要是为了在屏幕底部显示固定信息,只不过在 NES 上需要执行 复杂的定时写入,但 GameBoy 的 PPU 可以自动处理。

因此,游戏通常用它显示玩家的统计数据、得分等"常驻"信息。

精灵

Image
渲染的Sprite图层.

"精灵"(sprite)是可以在屏幕上独立移动的图块。 它们可以互相重叠,也可以隐藏在背景后面,能否看到则取决于它们显示的优先级顺序。

这个图层还有额外的可用(或必需)的颜色:透明度。 这首先意味着它们只能显示三种不同的灰度,而不是四种。 幸运的是,这个图层特意预留了 两个 专用调色板可供选择。

对象属性内存(Object Attribute Memory,OAM)是 PPU 中专门存储精灵图块的内存区域。 不同于其他图块的是,精灵是由 OAM 定义的。 游戏一般通过调用 OAM DMA 单元 来填充这个区域,DMA 会从 RAM(或游戏 ROM)提取数据,并发送到 OAM。 不过,当 DMA 正在运行的时候,CPU 就不能访问 WRAM 了(这也体现了为什么 HRAM 这么重要)。

除了图块索引以外,每个条目还包括下列属性:X-Y 位置、所选的调色板、显示优先级与翻转标志(以允许垂直或水平翻转)。

PPU 的渲染存在限制,每行扫描只能渲染至多 10 个 精灵(即每秒 40 帧);超过这部分的精灵将不会被渲染。

结果

Image
最后的结果 嗒哒!

完成了一帧,是时候继续下一帧了! 然而,在 PPU 读取 VRAM 的时候,CPU 不能修改它。这样一来,当 PPU 闲置的时候,系统就要触发中断。 这种行为与 NES 如出一辙。

完成一行扫描后,水平消隐 周期开始(即从一行扫描线的末尾到下一行扫描线的开头,约 21~48 微秒不等), 给这一帧没渲染完的部分提供时间。

完成全部扫描后,垂直消隐 周期开始(即从最后一行扫描线的末尾到第一行扫描线的开头,约 1.1 毫秒),指定的某个中断被调用。 现在游戏可以更新下一帧的图像。

在扫描线开头,会触发一个名为 OAM search 的额外状态,此时 PPU 正在处理该扫描线中将显示哪些精灵。这时游戏可以更新除 OAM 以外的任何区域。

机密与限制

窗口层和额外中断的加入使新的内容和效果得以实现。

晃动效果

Video
Video - 塞尔达传说:织梦岛(1993年原版) <剧透警告!!!>

水平中断允许在帧渲染完成之前改变帧。 这意味着可以在每一行应用不同的滚动值,从而使帧的每一行以不同的速度移动。

这就实现了一种有趣的摇摆效果(Wobbling)(我不确定这是不是它的正式名称)。

添加色彩

Game Boy Color的PPU是原版的超集。 现在,您将看到该品牌所谓的"Color"机型增加了哪些功能。

操作模式

Image
塞尔达传说:织梦岛 DX(1998 年重置版)。
这是一款"GBC 增强"游戏,现在运行于 CGB 模式。

Image
GameBoy Color 上的 Super Mario Land 2。 后者增加了彩色调色板,并以DMG模式运行。

首先,出于兼容性的考虑,新的PPU有两种工作模式。 然而,任天堂希望Color用户即使只玩单色游戏,也能看到增强的效果。 因此,两种操作模式如下:

整理(新)内容

CGB主板现在可容纳16 KB 的 VRAM,是原来 VRAM 容量的两倍。 由于CPU的寻址限制,这种新的安排以两个8 KB地址库的形式实现,由一个新寄存器(称为VBK)作为切换器。 另一方面,PPU可以同时访问这两个存储体。 说到底,这意味着程序员只需借助VBK填充VRAM地址库,然后在图块映射中指定图块所在的库,剩下的就交给PPU处理。

所以说,这些额外的 VRAM 可以做哪些事情? 很多很多:

视觉效果

得益于新的 PPU,现在程序员可以定义调色板了。他们有多达 32,768 种 颜色能够选择。

首先,开发者现在必须填充新的内存区域:调色板内存,它最多可以存储 16 个 调色板(一半给背景和窗口,一半给精灵),每个调色板编码 4 种 颜色 , 每种颜色由 16 位 / 2 字节的值来表示(但只使用其中的 15 位)。 此时 CPU 不处理调色板内存,但提供新的寄存器作为调色板内存的缓冲区(可以在 超级任天堂(SNES)上找到)。 总之,CPU 就是这么定义调色板的。

不过,"背景"和"窗口"图块可以引用这八个调色板中的任何一个。 同样的情况也会发生在精灵图块上,只不过它们只能使用三种颜色的调色板,因为有一个条目是为"透明"颜色预留的。

额外的空间

现在,图块集的大小是原来的两倍。 因此,程序员可以在VRAM中存储双倍数量的图块。 背景/窗口图块映射也得到了扩展,从而产生了额外的元数据编码。 从而扩展了这些图层的功能。 例如,它们的图块现在可以水平和垂直翻转,从而使游戏无需在VRAM中存储重复的图形(反过来,也可以利用这些图形绘制更多独特的内容)。

此外,CPU CGB还捆绑了一个额外的DMA单元,可将Game Pak或WRAM中的内容复制到VRAM中。 它以两种模式运行:

该设备再次为程序员提供了提供更丰富内容的新可能性,因为它可以利用原本空闲的时间。


Previous: 3. 中央处理器 (CPU)

Next: 5. 音频


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

主页 · 文章 · 支持 · 关于作者 · 关于此网站