« 3DS 的架构 (index)

3DS 的架构

Chapter 6: 图形


目录

  1. PICA200的架构
    1. 硬件组织
    2. 采用开放标准
  2. 构造帧
    1. 指令
    2. Vertex
    3. 几何
    4. 光栅器
    5. 像素
    6. 后处理
  3. 交互式比较
  4. 隐藏的附加功能
  5. 怀旧渲染

紧随新CPU而来的总是一个现代GPU。 那么,任天堂这次构建了什么样的图像处理单元(PPU)呢? 说实话,一个都没有。 这是他们掌机系列中首次求助于GPU供应商

尽管如此,任天堂的要求并未改变。 该公司仍然想要一个性能可接受的芯片......以及其知识产权核心。 将使他们能够将GPU嵌入到他们的SoC中,就像他们对ARM CPU所做的那样。

Image
《马力欧赛车7》(2011)

Image
《索尼克世代》(2011)

Image
新 Super Mario Bros. 2 (2012)

Image
《动物森友会:新叶》(2012)

Image
《塞尔达传说:姆吉拉的假面3D》(2015)

任天堂3DS游戏示例。 所有游戏都渲染两个400 x 240像素的帧和一个320 x 240像素的帧。

与此同时,一家潜在的候选公司刚刚在2006年SIGGRAPH大会上公布了他们的新发明。 一段时间以来,数码媒体专业公司(Digital Media Professionals Inc.,也称为"DMP")一直在为嵌入式市场构建经济实惠的GPU,虽然他们的芯片没有什么特别之处,但它们保证了不错的OpenGL ES支持。 此外,他们的授权框架提供了可综合的GPU

这对于任天堂来说似乎足够了,他们愉快地协商获得了DMP最新核心PICA200的授权,并随后将其捆绑到CPU CTR(任天堂3DS的SoC)内部。 这款GPU运行频率为268 MHz

PICA200的架构

如果用一句话来概括,PICA200是一个低成本、低功耗的3D处理器,它结合了预统一架构和现代化的API。 PICA200的底层架构被称为Maestro 2G ,其设计符合OpenGL ES 1.1,但扩展了OpenGL ES 2.0的元素 。 然而,PICA200的API并不局限于任何一个标准。

你看,尽管流水线是分离的,并且像素阶段是固定功能的(类似于PlayStation 2),DMP还是通过一套Maestro函数扩展了有限的电路,提供了超越嵌入式市场预期的功能 。 这包括片段光照、多种阴影算法、多边形细分、凹凸贴图、程序纹理和多种雾效。

此外,与Nintendo DS不同,PICA200只使用帧缓冲区。 就是这样。 精灵引擎,一种解决高昂内存需求的流行方法,现在已成为过去。 这还包括扫描线技巧,因为现代GPU的工作速度远快于CRT的刷新率。

硬件组织

既然我们知道这个主机可以绘制3D图形,现在的问题是:它在哪里存储其素材? 有两个位置,大型FCRAM块和较小但更快的VRAM

任天堂只为GPU提供了6MB的VRAM。 理想情况下,程序员会尽可能多地将数据放入其中,但由于它会很快被填满,因此预计它将用于存储需要即时访问的数据(即命令、缓冲区和重复纹理),而将其余数据放在FCRAM中。 PICA200带有一个DMA单元,可以在FCRAM和VRAM之间传输数据。 因此,归根结底,程序员有责任提出一个高效的布局以避免瓶颈。

Image
数据如何在可用内存中进行编排的例子.

在渲染过程中,程序员为许多操作分配专用的渲染缓冲区(即帧、模板、深度等)。 一直如此。 然而,对于3DS,LCD控制器不理解PICA200在帧缓冲区中渲染的数据。 因此,程序员还需要为LCD帧缓冲区保留额外的空间。 每个缓冲区都绑定到一个物理屏幕,并以LCD控制器所需的格式编码帧。

这意味着3DS需要至少分配三个LCD帧缓冲区(两个用于立体上屏,一个用于下屏)。 然而,为了避免显示伪影,可能会分配一套重复的缓冲区以进行页面翻转

基于此,显示过程如下:

  1. LCD根据索引寄存器的指示,持续显示活动LCD帧缓冲区的内容。
  2. 同时,GPU在单独的帧缓冲区中完成新几何体的渲染。
  3. 帧缓冲区被导出到非活动的LCD帧缓冲区。
  4. GPU交换活动LCD帧缓冲区的索引。
    • 出于实际原因,索引交换发生在垂直同步结束时,以避免画面撕裂。
  5. 此后,LCD将扫描最近更新的LCD帧缓冲区。

采用开放标准

有趣的是,就像ARM11 MPCore采用ARM的AXI协议互连其核心一样,DMP采用了不太专有的选项,称为开放核心协议(OCP)。 顾名思义,开放核心协议对其用户不施加任何许可限制,这可能是使用PICA200的供应商认为有利的。 为了比较,AXI于2003年发布(与AMBA 3规范一起),而OCP于2001年发布。 这确实让我好奇任天堂安装了什么样的技术来将来自PICA200的OCP信号转换为符合AXI的信号,以便SoC的其余部分能够理解它。 我猜测PICA200和AXI总线之间有一个桥接器。

有趣的是,PICA200的前身ULTRAY2000与其继任者有许多相似之处。 然而,最显著的区别是数据接口改用PCI和DDR-SDRAM协议 。

构造帧

自然地,GPU不了解显示器的立体或双屏性质,它只负责在游戏过程中渲染三个屏幕:

所有这些都可以显示8位RGB颜色,相当于高达1678万种颜色。

考虑到玩家期望所有三个屏幕(特别是前两个)都能达到可接受的帧率,单个PICA200在其整个运行过程中将承受大量工作负载,这是在评估其性能时需要记住的重要方面。

话虽如此,以下是数据如何传输以绘制单个帧的概述:

Image
PICA200中图形流水线的概述。

......按照本系列文章的惯例,我们现在将查看每个阶段发生的情况。

指令

Image
命令阶段概述.

这是任天堂首款最终以"常规方式"绘制三角形的掌机。 也就是说,通过使用命令。 但这并不是一个令人惊讶的因素,因为PICA200预计将遵循OpenGL ES的教义。

本质上,PICA200通过读取命令缓冲区来绘制多边形 。 此外,顶点数据可以嵌入到命令中,也可以存储在VRAM的单独缓冲区中,后者效率最高。

Vertex

Image
顶点 (vertex) 阶段概述.

PICA200提供了四个并行操作的顶点处理器(VP)。 然而,如果激活了几何着色器(下一个流水线阶段),则只能使用三个处理器。

每个核心计算由四个24位浮点值组成的96位向量 ,但与ARM11的VFP不同,它们不符合IEEE-754 。 顶点处理器使用PICA200特有的汇编语言进行编程(让人联想到Nvidia NV30的时代),并按以下方式操作 :

  1. 开发者使用PICA200汇编编写顶点着色器。 作为参考,指令集与Microsoft的vs_2_0非常相似 。
  2. 着色器使用专有汇编器进行编译。
  3. 3DS程序必须将编译后的二进制文件复制到内存中(FCRAM或VRAM)。
  4. 然后,3DS程序发出GPU命令以加载二进制文件并将其与程序连接。

一旦顶点核心处理完毕,它们将结果输出到同步控制块,该块充当顶点缓存和缓冲区。 它具有384字节的容量,能够容纳多达32个96位向量。 最后,下一个阶段从该块读取数据。

几何

Image
几何 (geometry) 阶段概述.

几何阶段是第八代主机的标志性功能,允许开发者从简单的顶点数据中生成复杂的几何体。

在这种情况下,PICA200的几何阶段是通过占用四个顶点处理器中的一个来实现的。 然后,"几何"顶点核心加载不同的顶点着色器。 最后,它从其他三个处理器接收顶点数据。

几何着色器的用途示例包括正方形或线条生成(使用点图元)、几何细分、轮廓边缘渲染;以及随机粒子生成。

光栅器

Image
光栅阶段概述.

在此阶段,所有图元都转换为像素。

PICA200上的光栅化单元非常简单,它只是从图元生成三角形,然后应用剔除和裁剪以移除不可见的三角形(分别隐藏在其他三角形后面和/或在视图区域之外)。 这与OpenGL ES的操作方式非常相似,尽管开发者在PICA200上工作时必须注意某些坐标系是反转的。

像素

Image
片元阶段概述。

片元阶段由两个区域组成:纹理单元,可以从内存中获取纹理并进行处理。 以及着色单元,可以对纹理数据执行额外操作。

PICA200包含四个纹理单元 ,每个单元都有256字节的L1缓存,并且它们都共享8 KB的L2缓存。 然而,这些单元并非同质的。 相反,每个单元的服务范围各不相同:

之后,着色单元的工作是创造性地处理输入的纹理。 然而——考虑到我们正在谈论第八代主机,这有些出乎意料——PICA200的单元不可用像素着色器进行编程 。 相反,我们发现有六个可配置的颜色混合器,每个混合器接收三个RGB或Alpha值并对其执行逻辑操作。 结果传递给下一个混合器,依此类推。 每个颜色混合器都可以从上一个混合器(第一个除外)、纹理单元或常量值获取输入。

总而言之,这是Flipper时代(同时遵守OpenGL规范 )的现代反映,但不要忘记开发者还可以将其与前面提到的Maestro函数结合使用。

后处理

Image
后处理阶段概述。

帧经过处理并准备写入帧缓冲区(或渲染目标)后,它会经历一系列最终的"校正"。 这类似于OpenGL ES 2.0的流水线。

话虽如此,帧会经过alpha模板深度测试。 之后,结果可以使用颜色混合器或逻辑运算符(AND、XOR等)与现有帧(在帧缓冲区中)混合。 最后,帧以整体形式或通过模板过滤器(用于遮罩)写入内存中分配的缓冲区。

为了进一步平滑边缘,PICA200可以以两倍于选定尺寸的帧缓冲区进行渲染,然后使用2x2抗锯齿进行平均。 这是一种称为超采样旧技术

一旦帧缓冲区准备好显示,它必须复制到内存中另一个名为LCD帧缓冲区的块中(其格式更符合LCD屏幕的扫描线程序),然后以扫描线的形式传输到LCD。

交互式比较

现在你已经了解了PICA200如何在屏幕上绘制三角形,是时候来看一些实际例子了。 这里我收集了来自《任天堂明星大乱斗》游戏中的两个马里奥,一个是Wii版,一个是3DS版。 请注意,新版"愤怒马里奥"的细节感知水平与家用机版本非常接近。

3D model 3D model 3D model
"现代版本"中可用的互动模型
Wii的任天堂明星大乱斗X(Super Smash Bros. Brawl)(2008)
5455个三角形

3D model 3D model 3D model
"现代版本"中可用的互动模型
3DS版《任天堂明星大乱斗》(2014)。
3,080个三角形。

值得再次提醒的是,实际上,PICA200将同时渲染三个屏幕,这是Wii的GPU所没有承受的任务。

隐藏的附加功能

"新"3DS版本似乎还捆绑了一个不常见的DSP,名为MVD。 它执行H.264&MJPEG解压缩以及YUV到RGB的颜色转换 。 CPU通过写入其寄存器来对其进行编程。 反过来,MVD内部有一个专用的DMA单元,可以独立处理FCRAM中的数据。

总的来说,关于这个组件没有详细的文档,我只能推测它位于SoC的某个地方。 新3DS上的网页浏览器似乎是其唯一的用户(用于加速视频播放)。

怀旧渲染

解释了这么多之后,还剩下一个问题没有回答:PICA200如何渲染任天堂DS和Game Boy Advance游戏? 你可能还记得DS和GBA的GPU在渲染和广播帧方面表现出完全不同的操作模式。

Image
由NDS[Graphics Engine](nintendo-ds#graphics)渲染的一帧,其流水线将2D和3D数据分离。 这是符合OpenGL规范的PICA200无法理解的。

解释是,DS和GBA的PPU(图像处理单元)都集成在SoC中,DSi/DS/GBA游戏将像它们最初在之前的游戏机上那样操作这些PPU。 PPU的输出(扫描线)被传递到一个名为LgyFB的模块,该模块可以选择性地放大帧,然后将其转发到帧缓冲区,PICA200将负责显示它。 ARM11及其DMA负责在此过程中处理所有内存传输。

自然,这种安排会增加一些延迟(即 卡顿),尽管对用户来说可以忽略不计。


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

Next: 7. 音频


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

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