« Xbox 360 架构 (index)

Xbox 360 架构

Chapter 4: 图形


目录

  1. 概述
    1. 新基础的到来
  2. Xenos的架构
  3. 硬件组织
  4. 构造画面(frame)
    1. 指令
    2. 顶点着色器
    3. 光栅化
    4. 像素着色器
    5. 像素操作
  5. 行业影响
  6. 视频输出
    1. 昙花一现的功能
    2. 对分辨率的新态度

这是Xenon的一个奇特方面。 虽然Xenon芯片本身集成了有趣的技术,使其成为对抗竞争对手的强大竞争者,但Xenon从未被设想为一个独奏者。 为了使整个游戏机具有极强的竞争力和持久的生命力,Xenon与另一个芯片——GPU紧密结合在一起。

Image
刺客信条(Assassin's Creed,2007)

Image
半条命2(橙盒版)(Half-life 2,2007)

Image
传送门2(Portal 2,2011)

Image
无主之地2(Borderlands 2,2012)

Image
侠盗猎车手V(Grand Theft Auto V,2013)

Xbox 360游戏的一些例子。 它们全部以最大分辨率(1280x720像素)呈现。

这款显卡芯片的设计制造商不是别人,正是英伟达的老对手——ATI。 回溯这段历史,一家名为'ArtX'的新公司由曾参与开发任天堂64图形芯片Reality协处理器的SGI前员工创立。 之后任天堂再度委托其打造GameCube主机的"Flipper"芯片......而彼时ATI正处在收购ArtX的过程中。 当时的ATI正凭借"ATI Rage"系列显卡在PC领域厮杀,不久便将吸纳Flipper芯片的原班工程师。 时间快进至2005年,英伟达(此时已为索尼供货)又与ATI在主机市场狭路相逢。

真是经久不衰的商战啊,谁又能预料这番缠斗中将催生何等革新之作呢?

概述

自从21世纪初以来,英伟达和ATI一直在性能上相互竞争,这通常通过向其旗舰品牌添加渐进式改进来实现。

Image
靠近GDDR3芯片的Xenos+EDRAM一体封装。

在引入可编程像素管线后,英伟达获得了相当大的优势,这一技术后来成为OpenGL和Direct3D规范的一部分。 因此,ATI别无选择,只能效仿。 然而,在2003年,在英伟达预期的"GeForce 5"系列让Direct3D 9用户失望后,ATI恢复了其用户基础,这些用户期望从英伟达的旗舰卡中获得更好的性能和功能。 因此,人们的注意力转向了ATI的Radeon 9000系列。

这些事件让ATI得以延续其霸主地位,但英伟达未曾料到,ATI早已在酝酿一项足以压制其十年的颠覆性技术。 该计划最终以统一着色器架构的形式落地,而承载它的载体正是微软Xbox 360——其搭载的全新图形芯片,代号Xenos

新基础的到来

你可能会惊讶地发现,微软对同构计算的推动也将GPU带入了这个混合体中。

你知道,曾经有一段时间,GPU只是简单的光栅化器,只有"接受或放弃"的功能,这意味着它们提供了一组固定的功能,程序员可以选择激活它们或不激活。 直到后来,借助SGI的革新,可编程顶点管线的出现才将部分算力负载从CPU剥离。 最后,"简单的光栅化器"定义变得_过时_,因为英伟达推广了一个新东西,称为可编程像素着色器,它给了程序员在光栅化后控制发生什么的自由。

Image
GPU总览。其由多个单元组成,其中包括可编程着色器。 在本文的例子中,GPU为顶点操作分配的单元比像素操作多,这意味着几何变换的速度会更快,但可能会牺牲一些颜色效果。

这表明,随着GPU的性能和功能不断提升,它们将逐渐开放,允许开发者实现他们所需的确切功能。 然而,这也将增加硅芯片的整体复杂性。

多年来,为了满足不断增长的需求,顶点和像素处理管线一直在扩大,但这也带来了新的可伸缩性问题。 毕竟,空间、成本和散热都有其物理限制。 那么,我们应该优先考虑哪些任务呢? 是顶点操作还是像素效果? 如果顶点处理能力不足,将会限制像素处理的速度。 同样,如果像素单元的表现不佳,也无法吸引用户,因为它们产生的画面效果会显得单调乏味。

Image
GPU的组成单元总览,其中引入了一种新的统一管线设计。 现在,顶点和像素处理这两个阶段都拥有相同数量的资源,因此开发者无需因为某些着色器单元性能较弱而减少操作。

基于此,ATI的架构师们重新思考,提出了两个关键问题:"有没有办法简化这个模型,而不是简单地增加更多的晶体管?"和"为什么像素和顶点管线要分开?" 最终,他们将这两个阶段合并为一个统一的电路模块。 这就是我们所说的"统一着色器模型"。在这种模型下,GPU仍然支持可编程的顶点和像素管线,但两者的计算电路是共享的。

这个新模型有两个主要优势:一是更平衡的扩展性,即像素和顶点管线现在能以相同的比例提升;二是程序员可以开发不受特定管线类型限制的着色器程序。 不过,实现这一点需要对API进行重大更改,以标准化其行为和可用性,这些更改要等到2006年的DirectX 10或2010年的OpenGL 3.3才会实现。

可以说,统一着色器模型已经成为图形行业的又一项标准。

Xenos的架构

在构建Xenos时,ATI借鉴了他们现有消费产品中的技术。 但具体是基于哪款现有显卡开发的Xenos,这一点很难确定。 维基百科将其与Radeon x1800中的"R520"核心联系起来,但我对此持怀疑态度,因为R520在新的统一架构方面存在一些根本性的差异。 由于缺乏可靠的资料来源,我转向了Xenia模拟器的Discord社区,在那里我幸运地收到了来自社区的很多回复,特别是TriΔng3l,他在进行模拟Xenos方面的工作。

本质上,Xenos是基于R400(也称为"Crayola")架构的,这是一个全新设计的架构,但除了Xenos之外,它从未以消费级显卡的形式出现过。 相反,ATI向PC用户提供了基于R500的显卡,这些显卡实际上是R300架构的延续。 有趣的是,一些R520显卡也融入了Crayola的技术,但它们被市场营销为"ATI Avivo",主要用于视频解码加速。

最终,ATI通过其新的R600架构(R400的演进版本),也被称为"TeraScale",在2007年随Radeon HD 2000系列显卡将统一着色器模型普及给了广大用户。 其余就是些老黄历了。

有趣的是,R400架构在智能手机领域也得到了延续,那就是ATI Imageon Z430,后来更名为Qualcomm Adreno 200,并经历了多次迭代。 这再次证明了创新技术总能找到进入移动市场的途径。

硬件组织

Xenos的另一个独特之处在于其三重内存架构(对于强调UMA来说...)。 Xenos使用两个不同的芯片来渲染图形,一个是前面提到的512 MB的GDDR3 DRAM(这与CPU共享),另一个是同一封装内较小但速度更快的内存芯片(只有Xenos可以访问)。 后者提供了10 MB的嵌入式动态RAM(EDRAM)。 有趣的是,EDRAM并不是一个新成分,它曾在GSGE以及最重要的,Flipper(也是ATI的发明)中出现过。

这512 MB存储了Xenos渲染一帧所需的大部分(如果不是全部)材料,包括纹理、着色器以及游戏所需的各种类型的缓冲区。 另一方面,10 MB的EDRAM用于需要快速访问的小元素,如Z缓冲区、模板缓冲区、后备缓冲区(中间帧缓冲区)以及任何其他需要的自定义缓冲区。 这减少了共享GDDR3 RAM的拥堵,并加快了使用这些缓冲区的操作速度。

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

如果这还不够,还有一个第三种来源可以喂养GPU,那就是直接连接到CPU的线路! 与以往所见的不同,CPU可以直接流式传输命令和几何数据,而无需通过传统的在外部内存中存储命令缓冲区的步骤,从而再次节省了主RAM的流量。 这就是微软所宣传的Xbox程序合成(Xbox Procedural Synthesis,XPS),并且是通过两个改变实现的:

总的来说,这种协同作用使得Xbox 360能够在不要求过高价格硬件的情况下实现如此高性能。

构造画面(frame)

那么,Xenon究竟是如何渲染一帧图像的呢? 其实,它的过程与市场上的其他GPU类似,涉及多个步骤。 你可以通过这个Xenos的图形管线图来了解整个过程 。

Image
Xenos内的图形管线总览

从图中可以看出,Xenos的图形管线阶段与其他不使用统一着色模型的图形芯片基本相同。 这是因为主要的改变发生在电路层面,而不是API层面。 这样,开发者就无需学习可能颠覆他们传统方法的新技术。不过,他们很快就会发现,这种新的底层设计不仅能提升性能,还能提供额外的功能(在传统功能之上)。

另一方面,这款GPU与微软开发的专有API——Direct3D 9紧密结合。 由于这款API与市面上的图形卡具有广泛的兼容性,它在PC市场上越来越受欢迎,这也让游戏开发者感到更加轻松。 尽管Xenos会展示一些在市面上看不到的独特行为,但Direct3D是微软提供的唯一一个能与Xenos通信的高级API。 因此,在Xbox 360中,我们发现了一个为Xenos额外功能量身定制的Direct3D 9半定制版本。 有趣的是,Direct3D和Xenos在设计中相互影响,Xenos也影响了Direct3D的未来版本(从版本10开始)。

现在,让我们深入探讨,看看这个图形管线是如何工作的,就像我们在其他文章中所做的那样。

指令

Image
命令阶段概述.

欢迎光临本系列的_第十二个多边形工厂_。 和往常一样,我们从指令阶段开始。 指令指导GPU在屏幕上绘制图像的内容、位置和方式。 不过,这次指令的存储方式有所不同,它们可以存储在主内存的缓冲区,或者直接由CPU传输。 然后,命令处理器会获取这些命令,解析后转发给执行相应操作的单元(因为命令可能包含各种指令,比如"绘制一个三角形"或"设置寄存器X")。

值得一提的是,在这一代技术中,传统的显示列表(Display Lists)已逐渐被命令缓冲区(Command Buffer)所取代。 尽管这两个术语听起来相近,但命令缓冲区引入了一些显示列表最初设计时未考虑的新操作,如顶点、像素和GPU控制等。 随着API的不断演进,命令缓冲区也随之适应现代需求,而显示列表自2008年起已被弃用(OpenGL在3.2版本中移除了它们)。

此外,Direct3D 9的命令缓冲区(在Xbox 360的官方SDK中提供)支持嵌入一种名为索引缓冲区(Index Buffers)的有趣数据格式。 这允许开发者重用顶点数据,避免内存中的几何数据重复。

最后,这款GPU还能根据开发者设定的条件选择性执行命令。 在Direct3D中,这被称为预测(Predication)。比如说它可以避免GPU处理可能被遮挡的几何体。

顶点着色器

Image
顶点 (vertex) 阶段概述. 你很快会发现,这个阶段和像素阶段也没有 那样地 不同.

Flipper时代(甚至是RCP时代,因为它有共同的核心开发团队成员)以来,ATI一直致力于提供几何处理单元来加速顶点操作。 随着Xenos的出现,现在可以通过Direct3D的高级着色器语言(High-Level Shader Language,HLSL)进行完全编程。HLSL类似于C语言,但用于实现顶点着色器,无需使用汇编语言,尽管汇编语言仍然可以使用。

Xenos和RSX都遵循顶点着色器模型3.0(vs_3_0)规范,该规范定义了一系列共同的功能和限制。 这包括支持512个或更多的指令槽位、分支操作码以及对纹理读取的支持等。 不过,两者的主要区别在于,PlayStation 3的开发者需要使用Nvidia的CG编译器(这是与Microsoft的HLSL合作的结果),而Xenos的开发者则依赖于Microsoft的工具套件,因此使用的是Direct3D的HLSL编译器。

此外,我们不应忽略的是,执行这些操作的硬件基于一个新的公式。 这种新的统一设计意味着顶点数据通过一个共享但更高效的管线进行处理,具体流程如下:

  1. 首先,顶点分组器根据接收到的指令,读取主内存中顶点数据的内存地址。接着,曲面细分器(Tessellator)将这些非三角形几何体(如四边形和参数曲线)转换为三角形,以便GPU的其他部分可以处理。 此外,曲面细分器还能将三角形细分为更小的图元,从而在不增加带宽的情况下实现更精细的细节。 顶点分组器每个时钟周期可以读取16字节的数据,并缓存最近处理的14个顶点
  2. 随后,序列器加载顶点着色器,并使用8KB的缓存来拉取顶点数据。
  3. 一旦所有顶点数据准备好进行处理,三个着色器管 线(每个包含16个ALU)将执行着色器程序。 每个着色器管线每次处理64字节的数据块。 向量到向量的运算需要四个周期,而向量到标量的运算只需一个周期。
  4. 着色器导出器将缓冲结果,并将它们发送回管道的起点,在那里图元汇编器会捡起这些数据用于光栅化。 或者,着色器导出器也可以将结果转发到后端中心,然后导出到主内存。
    • 这种能力意味着着色器可以直接将原始数据写入主内存,当我们讨论到"反盗版"部分时,这一点将非常重要......

光栅化

Image
光栅阶段概述.

一旦图元完成转换或细分,光栅化过程便开始,将图元转换为像素。

首先,图元汇编器从曲面细分器或着色器导出器接收顶点数据,并开始构建三角形。 这一过程通常在一个周期内完成,除非需要对顶点进行裁剪和剔除处理,以排除在视界外的不可见三角形。

接下来,扫描转换器接收三角形,并将它们组合成8x8像素的块,这些块被称为图块(没错,与2D游戏机中使用的术语相同)。 转换器每个周期生成一个图块,并将其发送到专门单元进行early Z值和模板测试。 到目前为止还不错吧? 有趣的是,这个专门单元采用了一种名为分层Z(Hierarchical Z,Hi-Z)的新型高效拒绝技术。

Hi-Z不是单独测试每个像素,而是将2x2像素作为一个组,通过计算这四个像素中的最大和最小Z值进行评估。 如果某个四分之一的最大Z值小于内存中存储的对应值,那么整个部分被认为是被遮挡的,因此这个四分之一区域将被放弃。

Hi-Z块使用专门的内存来执行这些操作,这种内存每个周期可以存储多达16个不同的Z值,用于对64个像素进行深度测试。 然而,这种内存的限制意味着,只有当帧缓冲器的分辨率不超过1280 x 720像素,并且启用了最多两个样本的多重采样抗锯齿(2x MSAA)时,Xenos才能执行Hi-Z操作。

最后,扫描转换器将2x2像素块(总计16x16像素)的组以64像素的批次发送到下一个处理阶段,在那里像素着色器会添加那些_引人注目_的视觉效果。

像素着色器

Image
像素着色器阶段总览

为了运行像素着色器,Xenos重新利用了顶点处理流程中的相同组件,但进行了一些小的调整。 同样,HLSL的像素着色器模型3.0(ps_3_0)规范定义了开发人员在这一阶段可以实现的效果,这与Sony的技术在功能上没有显著差异。 不过,由于底层架构的简化(或者说,统一),资源得到了整合,这使得整个处理流程中各阶段的性能更加均衡。

像素处理阶段的工作流程如下:

  1. 首先,序列器加载像素着色器程序,并将像素数据传递给插值器。
  2. 渲染管线插值器在四个顶点之间进行颜色插值,生成用于像素着色器的中间值。 每个周期可生成16种颜色。
  3. 接着,32KB的纹理缓存从主内存中获取和解压纹理数据,然后纹理管线以每个周期16个纹理元素的速度将数据传递给着色器管道。 纹理管线可以立即应用双线性过滤,还可以选择应用三线性过滤和各向异性过滤,但这需要额外的周期。
  4. 之前提到的三个着色器管线现在用于执行像素着色器,每个管道处理由插值器提供的16个2x2像素块组成的顶点。 这些ALU能够处理32位浮点数(符合IEEE 754标准),而不会受到性能影响。
  5. 着色器导出器后端中心将处理结果发送到内存。 后端中心每个周期可以输出两个2x2像素的块,总共8个像素。 此外,还可以导出包括Z缓冲区的新Z值和主内存中的任意数据。
    • 着色器导出器的结果不一定是最终的帧缓冲区数据。在拥有丰富场景的游戏中,通常需要渲染多个缓冲区(即"渲染目标"),这些缓冲区用于合成最终的帧。 这种方法被称为多阶段渲染。Xenos图形处理单元支持同时输出多达四个这样的渲染缓冲区,即多重渲染目标(MRT)。

像素操作

Image
可用的像素操作概述.

这就是渲染的全部内容,但我们还未探讨的是,那10MB的EDRAM如何提升性能。 这块芯片非常特殊,它内置逻辑电路,能够自动执行多重采样抗锯齿(MSAA)以及深度和模板检测。 其内部数据传输速率(内部逻辑电路与内部存储器之间)高达惊人的256 GB/秒,这使得它非常适合用来存储中间缓冲区,而不是将它们存储在主内存中。

唯一的不足之处在于,10MB的内存空间不足以存储大型缓冲区,尤其是当涉及到渲染高清帧(例如1280x720分辨率,并启用2x MSAA)时,更不用说1920x1080分辨率的高清帧了。 但不用担心,因为ATI公司支持一种称为分块渲染技术(这种技术在Dreamcast上也有应用)。 通过这种技术,我们可以渲染屏幕的一部分,将结果暂时存储在EDRAM中(以提高性能),最后再将这些分块在主内存中重新组合,形成完整的最终帧。 分块渲染技术的重要性非同小可,以至于微软公司更进一步,开发出了名为条件渲染分块的功能,这是Direct3D中的一个功能,它可以自动为分块渲染优化渲染管线, 无需开发人员手动调整每个渲染阶段来处理分块。

得益于这一新的数据传输速率,游戏设计师们现在可以追求在传统渲染系统下难以实现的高质量效果。 这包括使用更高级的抗锯齿方法(如4x MSAA)以及高动态范围渲染(HDR)。 你知道吗,HDR渲染需要使用64位像素,其中每个颜色通道都以16位浮点数(float)表示。 这种方法在数据传输方面历来开销很大,但它能提供足够的精度来呈现逼真的光影和色彩效果,这是Xbox 360游戏机现在能够实现的一大亮点。

行业影响

经过15年的发展,行业现状清楚地表明,统一着色器模型已经成为GPU基本组成部分之一。 有趣的是,当Direct3D 10和OpenGL 3.3分别在2006年和2010年首次亮相时,它们不仅统一了这一模型,而且还引入了新的功能和应用程序,这些功能和应用程序现在可以实现了。 例如,在Direct3D 10中增加了一个新的渲染管线阶段——几何着色器,以扩展曲面细分器的使用。

此外,Xenos还引入了新的编码方法,用于存储HDR像素,使用的位数不超过32位(因此,其节省了带宽和存储空间)。 他们提出的一个建议是使用10位浮点数来编码三种主要颜色,剩下的两位用于alpha通道(透明度)。 一年后(2006年),Direct3D 10和一个新的OpenGL扩展进一步采用了这个想法,并实现了(现在已标准化的)紧凑浮点数表示,该表示方法使用11位来编码红色和绿色,使用10位来编码蓝色。

Image
Froggy (2006)是英伟达的最新演示,展示了统一着色器(与GeForce 8系列显卡结合)的强大功能。 为了演示目的,这个演示还允许用户拍打和拉扯那只可怜的丑陋青蛙。

同样,自从游戏机发布以来的几年里,Xenos的着色器导出功能被许多新的应用程序编程接口(API)所采纳,包括苹果和Khronos的OpenCL,英伟达的CUDA,Direct3D 10的DirectCompute和OpenGL 4.3的计算着色器。 所有这些提供了一个平台,可以访问GPU的强大功能,而不必一定渲染任何东西,只需使用快速的着色器管线进行计算。 总的来说,这是通用GPU编程的又一次重大进步。

如果你想知道这些技术进步是否后来被整合到了Xbox 360中, 恐怕到了这款游戏机发布的时候,统一着色器还是一个相当新颖的概念。 因此,后来的技术发展(比如 Direct3D 10)并没有被回溯整合到Xbox 360上。 但这也为下一代游戏机留下了宝贵的遗产。

而个人电脑市场则经历了一场不同寻常的革命,这场革命的源头并非ATI。 最终,英伟达成为了首个推出采用统一着色器模型显卡的公司,我指的是2006年问世的GeForce 8系列(及其Tesla架构)。 有趣的是,同年PlayStation 3也发布了,虽然它使用的是英伟达的技术,但却是较旧的技术架构。

视频输出

与2006年发布的PlayStation 3不同,Xbox 360在2005年的发布正值视频信号从模拟(如RGB 和复合视频)向数字(如 HDMI)转变的时期。因此,Xbox 360的早期版本并没有附带后来迅速替代了模拟视频混合局面的HDMI接口

Image
两个不同版本的Xbox 360叠放在一起,上面的是Zephyr版本,下面的是Xenon版本。 请注意,Zephyr型号增加了HDMI接口,而Xenon版本仅配备了复合视频接口。

最初,第一个版本(称为Xenon,与CPU同名)仅配备了一个名为'A/V'的复合视频接口。 这个接口承载了所有初代Xbox上的信号,并增加了支持VGA的接口(初代Xbox有这些线路,但出于某种原因,从未启用)。

后来,在2006年,后续的主板版本Zephyr最终添加了HDMI接口,以跟上索尼的信号质量。 在内部,原始的视频编码器(称为ANA芯片)已被'HDMI ANA'(或HANA)模块取代。

尽管这在今天可能显得陈旧,但微软仍然规定开发者必须考虑他们的游戏在阴极射线管(CRT)屏幕上运行,这种屏幕倾向于产生过扫描。 因此,游戏不能在过扫描区域内放置任何重要指示标志。

昙花一现的功能

为了符合视频电子标准协会(VESA)的要求,微软在2008年11月发布了一个系统更新,以支持16:10的宽高比,但这项支持仅限于通过VGA信号输出。 游戏仍然只需要支持16:9和4:3的宽高比,因此使用16:10时会出现黑色边框(也就是 黑边)。 有趣的是,操作系统中内置了相关功能,允许游戏检测何时启用了16:10模式,但这些功能从未向公众开放。

此外,微软在2011年5月发布了一个系统更新,以添加对3D电视的支持,与PlayStation 3的做法类似。

对分辨率的新态度

尽管视频编码器支持多种信号格式,包括PAL、NTSC、720p和1080p,但微软建议发行商优先考虑720p分辨率,原因有二:

那么,为什么不选择1080p作为重点呢? 这是因为1080p对Xenos的负担显著加重,从而限制了抗锯齿等效果的实施。 因此,微软建议开发者在720p分辨率下渲染游戏,如有需要,再通过内部视频缩放器将其提升至1080p。 为了协助这一点,微软在2006年10月发布了另一个软件更新,以启用1080p(最初,只有1080i可用)。


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

Next: 5. 音频


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

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