任天堂64架构--实用分析

2020-05-19 00:59:10

任天堂的目标是为玩家提供尽可能好的图形,为此,它将与计算机图形领域最大的参与者之一合作,生产终极图形芯片。

其结果是为这家人设计了一个漂亮的控制台,并为开发人员提供了一本500页的手册。

别担心,我向你保证,这篇文章不会那么长&我很享受!

主处理器是运行频率为93.75 MHz的NEC VR4300,它是Silicon Graphics的MIPS R4300i的二进制兼容版本,具有以下特点:

MIPS III ISA:取代MIPS II,采用新的64位指令。64位字称为双字。

5级流水线:最多可以同时执行5条指令(详细说明可以在上一篇文章中找到)。

24 KB一级缓存:分为16 KB用于指令,8 KB用于数据。

此封装中还包括一个内部64位FPU,CPU将其识别为协处理器(COP1),尽管该单元安装在ALU旁边,并且只能通过ALU流水线访问,这意味着本身不存在协同处理。

RAM的组装方式遵循统一内存架构或“UMA”,即所有可用RAM仅集中在一个位置,任何需要RAM的组件都将访问此共享位置。在这种情况下,仲裁其访问的组件是GPU。

选择此设计的原因是,它节省了大量的生产成本,而另一方面,如果管理不当,它会增加访问争用。

由于统一内存架构,CPU不再能够直接访问RAM,因此GPU也将提供DMA功能。

除了UMA之外,RAM的结构有点复杂,所以我将尽量保持简单,这里是&;mldr。

系统物理上包含4.5MB的RAM,但是它是使用9位数据总线连接的,其中第9位保留给GPU(稍后将详细介绍)。因此,除GPU之外的每个组件最多只能找到4 MB。

安装在电路板上的RAM类型被称为Rambus DRAM或简称“RDRAM”,这只是另一个在成为下一标准时与SDRAM竞争的设计。RDRAM以串行方式连接(每次传输一位),而SDRAM使用并行连接(一次传输多位)。

RDRAM的延迟与安装的存储体数量成正比,因此在这种情况下,考虑到此系统拥有的RAM数量,所产生的延迟是相当大的。

相比之下,这个控制台上的可用RAM可以通过安装Expansion Pak附件来扩展:一个外观别致的小盒子,包含4.5MB。奇怪的是,RAM总线必须终止,所以控制台总是附带一个终结器(称为跳线包)来代替扩展包。现在,您可能会问,如果您在没有安装任何Pak的情况下打开控制台,会发生什么情况?从字面上看什么都没有,你会得到一个空白屏幕!

图形的核心驻留在由Silicon Graphics设计的一个名为Reality Co-Processor的巨型芯片上,运行速度为62.5 MHz。这个软件包包含很多电路,所以如果你觉得很难跟上,也不用担心,图形子系统的架构非常复杂!这种设计的主要理念是,GPU不像竞争对手的那样是一个“简单”的光栅化器,相反,它还应该能够加速几何计算(卸载CPU),为此,需要更多的电路。

话虽如此,该芯片分为三个主要模块,其中两个用于图形处理:

标量单元:基于MIPS R400的CPU,实现R400指令集的子集。

向量单元:用32个128位寄存器执行向量运算的协处理器。每个寄存器被分成8个部分,一次操作8个16位矢量(就像传统CPU上的SIMD指令一样)。

系统控制:提供DMA功能并控制其邻居模块RDP(稍后详细介绍)的另一个协处理器。

为了操作该模块,CPU在RAM中存储一系列称为显示列表的命令以及将要操作的数据,然后RSP读取该列表并对其应用所需的操作。可用的功能包括几何体变换(如透视投影)、剪裁和照明。

这看起来很简单,但是它是如何执行这些操作的呢?嗯,有趣的是:与它的竞争对手(PS1和土星)不同,几何引擎并不是硬连线的。相反,RSP包含一些内存(4KB用于指令,4KB用于数据)来存储微码,这是一个不超过1000条指令的小程序,用于实现图形流水线。换句话说,它指导标量单元应该如何操作我们的图形数据。微码在运行时由CPU馈送。

任天堂提供了不同的微码可供选择,与SNES的后台模式类似,每个微码都以不同的方式平衡资源。

在RSP处理完我们的多边形数据之后,它将开始向下一个模块RDP发送光栅化命令来绘制帧。这些命令要么使用称为Xbus的专用总线发送,要么通过主RAM发送。

RDP是另一个处理器(这次具有固定功能),它包括多个引擎,用于将纹理映射到多边形、混合颜色和构建新框架。

它可以将三角形或矩形作为图元处理,后者对于绘制精灵非常有用。RDP的光栅化管道包含以下块:

纹理单元:使用4KB的专用内存(称为“TMEM”)处理纹理,最多可使用8个平铺用于纹理。它可以对它们执行以下操作:双线性过滤:将选定的2D纹理映射到3D形状上,并对其进行平滑以避免像素化区域。一个“完整”的过滤器需要四个点来执行插值,然而,这个控制台只使用了三个点(三角形插值),导致了一些异常。因此,某些纹理必须事先“调整”。

MIP映射:根据纹理的细节级别自动选择纹理的缩小版本。这样可以避免计算远离摄影机可见的大型纹理,并防止出现锯齿。如果启用,N64将改用三线性过滤映射纹理。此新算法还将在mipmap之间进行插值,以柔化细节级别的突然变化。

透视校正:选择将纹理映射到三角形的算法。与其他算法不同,该算法考虑了每个基本体的深度值,从而获得了更好的效果。

颜色组合器:混合和插值多层颜色(例如,应用着色器)。

混合器:将像素与当前帧缓冲区混合,以应用半透明、抗锯齿、雾化和抖动。它还执行z缓冲(稍后将详细介绍)。

存储器接口:由前面的块用来读写RAM中的当前帧缓冲区和/或填充TMEM。

RDP提供四种功能模式,每种模式都以不同方式组合这些模块,以优化特定操作。

由于此模块不断更新帧缓冲区,因此它处理RAM的方式非常不同:还记得不寻常的9位“字节”吗?第九位用于与帧缓冲区相关的计算(如z缓冲和抗锯齿),并且只能通过内存接口访问。

产生的帧缓冲区必须发送到视频编码器才能在屏幕上显示(DMA和视频接口组件是完成此任务的关键)。

理论上最大容量为24位色深(1680万色)和640x480分辨率(或PAL区域中的720x576)。我提到这是“理论上的”,因为使用最大的能力可能会耗费资源,所以程序员会倾向于使用较低的统计数据来释放足够的资源用于其他服务。

让我们把前面所有的解释都放在正确的角度,因为我将借用任天堂的超级马里奥64来简而言之地展示一个框架是如何组成的:

首先,我们的3D模型位于盒式ROM中,但是为了保持稳定的带宽,我们需要首先将它们复制到RAM中。

然后是使用我们的模型构建场景的时候了,CPU可以自己完成,但可能需要很长时间,所以任务被委托给RCP。CPU将改为向RCP发送命令,这是通过执行以下任务来完成的:

组成包含RSP要执行的操作的显示列表,并将其存储在RAM中。

之后,RSP将开始执行第一批任务,结果将以光栅化命令的形式发送到RDP。

到目前为止,我们成功地处理了我们的数据并对其应用了一些效果,但我们仍然需要:

正如您可能猜到的那样,这些任务将由RDP执行。CPU会将数据(如纹理)放到RAM上,这个模块有固定的流水线,但我们可以根据当前任务选择最佳的操作模式来提高帧率。

一旦RDP完成数据处理,它将把最终的位图写入RAM中的帧缓冲区。之后,CPU必须将新帧传输到视频接口(最好使用DMA),视频接口再将其发送到视频编码器进行显示。

这里有一些超级任天堂以前的2D角色的例子,它们是为新的3D时代重新设计的,它们是交互式的,所以我鼓励你去看看它们!

如果你读过以前的控制台,你会遇到关于曲面可见性的无休止的问题,现在你可能认为多边形排序是解决这个问题的唯一方法。在本系列中,RDP第一次采用了一种称为Z-Buffering的基于硬件的方法。简而言之,RDP在内存中分配一个名为Z-Buffer的额外缓冲区。这与帧缓冲区的尺寸相同,但是每个条目都包含最近像素相对于摄影机的深度(Z值),而不是存储RGB值。

在RDP栅格化矢量之后,将新像素的z值与Z缓冲器中的相应值进行比较。如果新像素包含较小的z值,则意味着新像素位于前一个像素的前面,因此它将应用于帧缓冲区,并且z缓冲区也会更新。否则,该像素将被丢弃。

总体而言,这是一个非常受欢迎的补充:程序员不再需要担心实现基于软件的多边形排序方法,这会耗尽大量的CPU资源。但是,Z缓冲区并不能使您免于输入不必要的几何体(丢弃或透绘,两者都会消耗资源)。为此,游戏引擎可能会选择包括遮挡剔除算法,以尽早丢弃不可见的几何体。

SGI显然在这个系统上投入了大量技术。尽管如此,这是一款面向家庭的游戏机,因此,它必须降低成本。一些艰难的决定给程序员带来了困难的挑战:

由于图形流水线中的组件和操作数量巨大,RCP最终非常容易出现停滞:这是一种不受欢迎的情况,因为所需的数据在流水线后面延迟,子组件会在相当长的一段时间内保持空闲。

这总是会导致性能下降,并由程序员来避免它们。虽然为了让事情变得更简单,一些CPU,如标量单元,实现了一种称为旁路的功能,它通过绕过一些可以跳过的执行阶段来以更快的速度执行类似的指令。例如,如果我们必须计算连续的加法指令,则不需要将结果写回寄存器,然后在每次加法完成时将其读回,而是可以对所有加法保持使用相同的寄存器,并在最后一次加法完成后进行回写。

在RDP内部有4KB的纹理内存可用作纹理缓存,其主要目标是避免停止RAM的读取周期。不幸的是,在实践中,4KB碰巧不足以处理高分辨率纹理。此外,如果使用mipmap,则可用缓存量将减少一半。

因此,一些游戏使用纯色和Gouraud着色(如超级马里奥64),而另一些游戏则依赖于预计算纹理(例如,必须混合多个层)。

在我们进入细节之前,让我们先定义音频子系统的两个端点:

我们的起点是盒式ROM,它包含只有CPU才能解释的数据。

终点是数模转换器或“DAC”,它只理解波形数据。

现在,我们如何将两端连接起来呢?游戏机通常包括一个专门的音频芯片,为我们完成这项工作。不幸的是,任天堂64没有这样的专用芯片,所以这个任务分布在这些组件上:

主CPU:将音频数据从游戏的ROM传输到RAM,然后初始化音频列表以供RSP使用。

RSP:通过使用更多的微码,它解释先前存储在RAM中的音频列表,并对音频数据执行所需的操作,例如,可以包括:

如预期的那样,结果数据是波形数据。然后将其发送到音频接口或“AI”模块,然后再将其传输到数模转换器。得到的波形包含两个通道(因为我们的系统是立体声的),每个通道都有16位分辨率。

是时候检查为N64制作的配乐了。有太多(好的)要在本文中提及,所以这里有一些吸引了我的注意:

采样率最高可达44.1 Hz,但使用最高采样率会占用大量CPU周期。

通道的数量没有严格的限制,这完全取决于RSP能够混合多少(如果处理ADPCM,通常大约16-24个通道;如果处理PCM,通常大约100个通道)。

内存是另一个令人担忧的问题,而竞争对手依赖更大的介质(即CD-ROM)和专用音频内存,而任天堂64墨盒存储的数据(更不用说音乐数据)要少得多,而且必须与其他组件共享其主内存。出于这些原因,玩家可能会注意到N64端口包含的音乐质量较差或乐谱重复。克服这一限制的一种方法包括实现一个软件定序器,该软件定序器可以在运行时使用预先填充的一组声音(类似于MIDI音乐)来“构造”样本。

与PS1和土星类似,N64游戏是为裸机编写的。但是,没有可用的BIOS例程来简化某些操作。作为替代,游戏嵌入了小型操作系统,提供了相当大的抽象量来有效地处理CPU、GPU和I/O。

这不是我们最初可能想象的传统桌面操作系统,它只是一个占用空间最小的微内核,提供以下功能:

内核是通过使用任天堂的库自动嵌入的,此外,如果程序员决定不包括其中一个库,内核的相应部分将被跳过,以避免浪费盒式磁带空间。

正如您现在所知道的,I/O没有直接连接到CPU,所以RCP的第三个模块(我到现在还没有提到过)用作I/O接口,它主要与CPU、控制器、游戏盒和音频/视频DAC通信。

任天堂保留了盒式介质进行存储,因此,游戏享有更高的带宽(根据ROM的速度,在5-50MB/s之间),同时制作成本也更高。市场上发现的最大的墨盒有64MB。

在盒式磁带内部,制造商可能包括额外的存储器(以EEPROM、闪存或带电池的SRAM的形式)来保存保存,但是这不再是一个强烈的要求,因为某些附件也可以用来保存保存。

任天堂64控制器包括一个用于插入附件的接口,其中一些是:

控制器包:用于存储、保存数据并在其他控制台上使用的另一种介质(类似于索尼的存储卡)。

Rumble Pak:包含一个小型马达,用于提供触觉反馈,可让玩家沉浸在某些游戏中。

除此之外,这款游戏机的主板底部有一个特殊的接口,原本是供尚未发布的磁盘驱动器使用的,这是一种包含专有磁盘读取器的“额外地板”,尽管如此,该驱动器只在日本发布,并最终取消了在世界其他地区的销售。

一般来说,开发主要是用C语言进行的,为了获得更好的性能,也使用了汇编语言。虽然该系统包含64位指令集,但64位指令很少使用,因为在实践中,32位指令恰好执行得更快,并且需要一半的存储空间。

为了命令RCP,库包含多个抽象层,例如,像Graphics Binary Interface或‘GBI’这样的结构被设计成更容易地组合必要的显示列表,同样适用于音频函数(其结构被称为Audio Binary Interface或‘ABI’)。

在微码开发方面,任天堂已经提供了一套微码程序可供选择,然而,如果开发者想要定制它,这确实是一项具有挑战性的任务:Scalar Unit指令集最初没有文档(当然是应任天堂的要求),后来该公司改变了立场,SGI最终发布了一些微码编程文档。

用于开发的硬件包括SGI提供的工作站,比如Indy机器,它附带了一个名为U64的额外子板,其中包含零售控制台的硬件和I/O。还为Windows计算机提供了工具。

其他第三方工具包含在带有连接到工作站的长带状电缆的墨盒中。该盒安装在零售任天堂64中,但包括将读取请求从控制台重定向到工作站RAM的内部电路。部署/调试过程是通过将游戏的副本传输到RAM来执行的,然后,当控制台打开时,它将从那里开始读取。

反盗版系统是SNES CIC的延续。正如你所知道的,盗版检测和区域锁定都要归功于CIC芯片(它必须出现在每个授权的游戏盒中),任天堂64改进了这个系统,要求不同的游戏具有特定变体的CIC芯片,以确保盒不是假冒的或包含CIC克隆,外围接口或“PIF”会在游戏开始时和游戏期间进行校验和检查,以监督安装在盒上的当前CIC。

如果由于任何原因,PIF认为当前的墨盒无效,则会导致控制台永久冻结。

区域锁定是通过在不同区域之间稍微改变墨盒的形状来完成的,这样用户就不能从不同的区域将游戏物理地插入到N64上。

总体而言,由于盒式介质的使用,盗版问题并没有太大的担忧,尽管游戏价格比基于CD的游戏价格高出三倍。

尽管看起来可能很傻,但任天堂留下了一扇门是开着的:磁盘驱动器端口。

一些公司为了开发自己的硬件而逆向设计了界面,一些由此产生的产品成为了盗版的问题。

我想值得一提的是Doctor v64,这款设备与磁盘驱动器端口的形状相同,但包括一个CD-ROM驱动器,用于将盒式磁带的内容克隆到CD上,相反的情况(从CD读取ROM)也是可能的。

当我还是个孩子的时候

..