3d王朝图形加速卡.docx
- 文档编号:9788609
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:22
- 大小:37.41KB
3d王朝图形加速卡.docx
《3d王朝图形加速卡.docx》由会员分享,可在线阅读,更多相关《3d王朝图形加速卡.docx(22页珍藏版)》请在冰豆网上搜索。
3d王朝图形加速卡
此文首发与3DM,转载请注明出处即可。
3DM曾经汉化过那么多I社神作,首发再次聊表敬意。
文中难免错误百出,结构混乱,这也是我文章的特点,欢迎指正,反正我早就破罐子破摔了。
当然如果你在某个“哔”论坛PC版块看到此文不要惊讶,很有可能是我去混分的·······
想完全诠释3D图形加速芯片的各个方面,做到层次分明有理有据,再做到精简就很困难了,但我依旧会尽量控制文本的整体规模。
GPU全称GraphicProcessingUni,直译过来就是图形处理单元。
最初出现于NVIDIA的Geforce2563D图形卡以后。
这本来算是个概念,因为当时NVIDIA的Geforce256演示demo展示了非常精细的毛发效果,NVIDIA的意思是以后就有了这种CG级的游戏画面。
同时期的ATI也提出了VPU的概念,但GPU这个名称更加广泛而被沿用至今。
通常来说,对于PC用户中的3D游戏用户,其3D图形加速卡的性能是机器性能的第一标尺。
本文的目的是从架构方面来拆分和分析GPU的各个方面。
在绘制一幅3D场景中,GPU负责多边形的构造、贴图、着色器指令、光照、阴影填充、以及最终的像素输出。
CPU负责顶点位置,阴影边框绘制、AI运算以及其他运算指令,包括网络。
GPU要处理的东西具体到游戏主要分为材质库和着色器,这个我们从指令的角度拆着说,主要从GPU架构来分析对性能影响的各个单元。
本文不涉及显卡本身,这部分我会放在主板一文来写。
(如果我写的话)
非统一渲染架构已经没有必要讨论,于是从最典型的统一渲染架构来逐步描述。
对于混乱的论证层级请勿怪。
我们将3D图形的处理一般称为图形流水线,这个过程大致是这样的:
3D建模--多边形坐标变换及计算--光源处理--多边形坐标转换为屏幕所对应的坐标---对这些坐标做着色器和贴图运算---渲染及缓冲---输出图像。
当然这之前还有指令列表处理几何处理以及渲染流输出等。
具体到流程,首先是InputAssemblerStage(输入汇编阶段),这个阶段依靠图元以及顶点信息作生成顶点、和图元地址。
再由GeometryShader一次性处理全部图元,其中可直接包含三角形、线、点。
在G80中还引入了GeometryShader,其主要作用是分担一部分物理操作。
最后进行缓存输入、深度/Stencil测试和alpga混合。
我到这里得打住,乱了。
先从GPU的规格谈起,再说架构吧。
对于GPU性能的判定,主要从规格和架构2个方面。
第一节:
规格和指标
GPU主要规格指标:
流处理器数量
阵列数量
光栅处理器数量
显存控制器数量
纹理单元数量
核心频率
显存频率
显存容量
先依次简单分析
1.流处理器数量
流处理器数量是3D图形核心重要性能指标。
目前微软的directx作为最广泛的图形API,在一帧画面中所输入的指令几乎全部由流处理器来运算。
从坐标到像素再到光源以及相应的转换,包括由于画面形成过程中所形成的数学向的计算。
因此流处理器的数量越多,GPU的运算能力也就越强。
特别是在光源复杂的环境,以及像素级纹理大量运用的场景,只要指令端口和外部总线可以承受住线程压力,这种运算能力的提升几乎是成绝对线性的,理论上说只要程序员敢调用足够多的着色器,就可以形成CG级的游戏画面。
当然这只是理想的情况,实际的运用中限制就很多很多了。
而且流处理器数量也和通用计算能力息息相关。
在早期directx9系列显卡的ALU,具备全4D运算能力,但无论1D还是4D,ALU只能以等效于核心频率进行运算。
因此在对比directx9显卡的渲染管线和directx10、11显卡的流处理数量的时候不可绝对的画等号来比较,这里略微提下。
2.阵列数量
我在这里无论是GPC,TPC还是SM,SMX,都看作是近似的阵列。
严格意义上来说SM和SMX才是真正的阵列。
GPC和TPC更接近于材质通道/线程通道这种单元。
TPC在D11时代已经消失,不再讨论。
GPC作为阵列的集合存在,从物理结构上来说包含SMX和细分曲面单元,从功能上来说又在线程分派上起着承上启下的作用。
随着SMX的线程分派器的功能日益强大,GPC的数量相对于ALU的整体规模实际上是在缩小的。
从好的一面说,在密集型线程方面,这种架构有着延迟低的优势,而劣势是阵列的线程分派器的压力就很大了。
现在SMX能够容纳的ALU单元数量,从本质上来说,并不是阵列能容纳的数量而是SMX这一级的指令分派器能够容纳的数量。
从目前单SP的执行效率来看,如果下一步GPU需要扩容ALU单元来提升性能,那么GPC的数量会进一步提升,阵列内含的ALU数量提升会止步或者提升较小。
3.光栅处理器
光栅处理器处于外部总线的末端,所有处理好的指令包括纹理纵深光源都由光栅处理器转化为像素并且最终输送到显示器。
也就是说,光栅处理器几乎是GPU的必然短板。
无论内部如何强大,最终光栅化的时候如果光栅处理器数量不够就会造成帧数下降从而影响用会的使用体验。
在物理结构上光栅处理器和显存控制器挂钩,每64bit的显存控制器和一组光栅处理器一起。
最初的每组显存控制器只携带一个ROP,目前这个数量已经提升到了8个。
ROP的总数量最大是位宽/64×8,可以低于这个数量,但不可能比这个高。
而且由于设计上的原因,光栅处理器的数量扩大非常困难。
更主要的是,由于光栅处理器直接影响GPU的像素处理能力,所以其数量也极大的影响GPU的抗锯齿性能。
特别是在复杂光照的环境下,材质表面的漫散射加上全局光照对像素的压力,加上由于多光源下的延迟渲染导致的抗锯齿压力非常巨大。
4.显存控制器数量
显存控制器每个为64bit,所以显存控制器的多寡也就是显卡位宽相关。
由于显存带宽是显存频率×显存位宽/8,而显存带宽责和显卡的性能相关性非常的大,加之显存控制器数量和ROP数量直接挂钩,说显存控制器的多寡和GPU的整体性能成几乎绝对的线性正比。
显存里存放着材质库,帧缓冲,顶点信息,着色器等GPU输入或者输出的重要数据,显存的速度也就直接决定了显卡能运行的帧数。
而在GPU的设计中,显存控制器也成为永恒的短板,其原因很多。
显存控制器的晶体管耗用极大,而当显存控制器数量较多的时候,外部总线压力也在随着增大,最终影响显存控制器能够吃下的显存频率,甚至进一步影响显卡的核心运行频率,而ALU和ROP等重要单元频率都和核心频率挂钩,所以显存控制器的数量多寡在设计的时候也是R&D要考虑的重要方面。
另一方面,使用加大显存位宽的方式来提升显存频率固然美好,但随之带来的成本问题确非常巨大。
由于单个颗粒的显存位宽是固定的(通常规为32bit),一个256bit的显卡只需要256/32=8颗就可以布置完毕,如果这个位宽是512bit则需要至少16颗颗粒,这还不是主要的。
为256bit的8颗粒完成布线,6层PCB板就足够了,而512bit需要12层甚至更多。
而PCB的成本占显卡制造成本的绝对大头,而PCB的物料成本是不高的,真正高的就是布线成本。
所以现在的GPU制造商都采取使用每显存控制器携带更多ROP,同时使用高频率颗粒的方式在低显存控制器数量的情况下维持相对较高的像素输出能力和显存带宽。
5.纹理单元数量
纹理单元数量曾经一度是GPU性能第一标尺,但随着统一渲染架构的出现,纹理单元的作用实际应该在逐渐弱化。
我曾经甚至认为在不久的将来纹理单元的数量将不会被GPU厂商作为一个重要规格来展示。
在GPU形成像素输出之前,画面在形成的过程中有一步很重要的贴图步骤就是由纹理单元来完成的。
在多边形表面形成材质才能最终反映出接近真实的3D画面。
而且大量的游戏也采用预先烘培好的材质贴图来优化画面。
所以纹理单元数量直接关系GPU高分辨纹理下的性能。
比如孤岛危机弹头大量采用动态纹理(纹理会根据人物的观察视角的改变而变化坐标,并产生一定的覆盖效果,也就是动态法线)和高分辨纹理,带来真实纹理体验的同时也带来了巨大的性能损失。
G80体系架构下的纹理短板造成它在这个游戏里的性能没有达到预期。
由于人眼对颜色的辨识相对多边形来说要更为敏感,所以用材质贴图来实现物体的真实感也一直以来被大量使用,特别是在GPU运算能力相对低下的年代。
比如一个抽屉的把手,就可以采用贴图来实现,这相对于直接使用顶点+着色器来渲染负载要低得多,而且效果也较为接近。
但这也有问题,那就是目前的GPU其shader处理能力已经及其强大,但程序员依旧习惯于使用纹理来实现华丽的画质,这不得不说是一种退步。
即使CE3都是基于D9开发环境的,然后辅助以烘培好的高分辨纹理来实现D11画质,甚至于3Dmark11测试软件都更加偏向于使用纹理。
一方面是方便引擎的快速过渡,另一方面可能和引擎要照顾到多平台有关,这个不仅仅是考虑到在使用D9显卡的用户,还有不具备粒子操作能力的家用机GPU。
而在寒霜2引擎中,我们最明显的感觉就是出色的光照,寒霜2的光照就是基于D11的computeshader制作,我们也能看到新一代的D11显卡在这个游戏里表现良好,像素纹理的应用也逐渐开始,我们翘首以盼吧。
就像Z-bufferZ-CullStencil-Cull现在就不怎么再提了,Z/Stencil操作根据Z轴剔除不可见的像素,以减少最终的像素操作,现在剔除操作在像素输出时完成,如果在渲染之前剔除则存在一种仲裁压力和返回检查带来的延迟,据说在抗锯齿开启后ROP压力反倒更大。
目前采用渲染前剔除操作的就是powerVR公司的SGX系列GPU,平板里这个东西居多,早期的intel整合芯片譬如GMA3000其实就是SGX545。
而现在Z/Stencil单元已经不作为性能标尺被明显标注数量了。
6.核心频率
核心频率自然是越高越好,这里谈谈相关性的问题。
GK104之前nvidia通过一种倍频技术实现了流处理器的异步频率,这个技术最早出现在G71核心上,nvidia给予G71的shader单元一个以23Mhz的步进频率,这个提升幅度非常小,小到你感觉不到它带来的性能提升,只是你在超频的时候这个步进频率会影响到GPU的实际运行频率导致超频失败,那时候的shader异步更接近于现在的睿频技术。
GK104回归流处理器和核心同频其实就是因为频率的相关性带来的设计思路改革,这也和我上面说纹理单元的时候提到的纹理依旧大行其道也有关系。
核心频率和运算单元、线程单元以及非常重要ROP单元同频或者程步进频率关系。
在RV770对战G200的堪称史诗级别的对决中,RV770以小核心打得规格强上很多的G200非常难受。
G200的规格要高的多,问题出在哪里。
RV770的小插曲:
我们只能很遗憾的承认,当今的AMD图形团队已经不是当年那个设计RV770的带有狂热工程师导向的团队了。
在RV770的设计上,曾经流传着各种坊间传说,其中一个版本就是RV770的首席设计师在设计之初坚定不移的要应用DDR5显存颗粒。
当然这个故事有另外的版本,按照通常的核心策略,RV600之后经过修改推出RV670,那么之后的RV770在规格上应该有比较大的改动。
在设计之初,RV770的目标被定位于次顶级版本也就是4850性能要略超过3870同时超过8800GT,而旗舰型号也就是4870(4890是新制程)性能要略高于9800GTX。
连NVIDIA也是这么预测的,所以G200没有设计中端型号。
按照NVIDIA的估计,260275以及280将是一种类似8800GTS8800GT8800TX的定位(这是按照RV600来说明而不是G92和RV670的局面),也就是高端无对手,价格空间宽裕。
然后设计了GT240,一个在性能上接近9600GT的中低GPU配合9800GTX来合围想象中的4850,然后使用9800GTX和260来合围4870。
AMD这边则希望设计一个至少可以大幅度击败G80的单卡,因为此时8800Ultra已经停产很久了。
最先设计出来了一个SP规模640,同时使用DDR4显存控制器的版本,效果很不理想,8800Ultra的阴霾甚至都无法一扫而光,于是设计团队激进的使用了DDR5规格的显存控制器,后面的故事我们都知道了,RV770成就了ATI的小核心传奇。
4870和GTX260192SP的比较就非常典型。
260的ROP数量是28,4870是16个,但260当时的核心频率仅为576,而4870高达750,像素输出优势并不大。
而且加上GDDR5颗粒的高频,260的位宽优势基本没有带来更高的带宽,只换来恐怖的PCB布线成本,260的运算单元数量优势也被主频拖累。
GK104的思路就是放弃2倍SP频率,换来高核心频率,更高的频率显存控制器,同时小核心方便它布置更多的纹理单元,带来游戏性能的均衡提升。
当然NVIDIA的之前分频SP以及明显短板的显存控制器设计还有其他的原因在里面,这个我放到芯片策略一节来讲。
所以有的时候规格也未必是绝对主导,核心频率较高的小核心也能依靠频率带来的运算能力全面提升实现较高性能。
7.显存频率和显存大小
在这个里我决定讲二者合并说明.
显存频率和显存位宽决定显存带宽,显存带宽则决定着显卡的吞吐性能,特别是高分辨率下的抗锯齿加上高分辨率纹理下的画面。
显存中主要存放着材质库,帧缓冲,顶点信息,着色器,着色器很多但占空间不大。
如果显存频率和显存位宽双低,则会造成显卡在输入和输出时候带宽不够用带来卡顿。
理论上说越好的GPU需要的显卡带宽越高,这个甚至是没有上限的,特别是对于旗舰级的GPU显存带宽基本是100%处于饥渴模式,GPU运算单元一直在暴增,但前述的一些原因也说明了,GPU的显存控制器和ROP扩容相对要困难许多。
我们在对GPU超频的时候,一般是核心和显存同时超频也是这个道理。
显存频率和显存容量是两个息息相关同时在规格上要做到尽量平衡。
显存频率太低,即使显存容量较高,由于带宽不足虽然存放空间充裕但GPU依旧得不到数据,如果显存容量太小,显存频率很高,则虽然带宽满足,但存储空间不足依旧会造成GPU的频繁等待,换来的还是画面的卡顿。
我们知道7600GS128MDDR3的性能要好于7600GS256MDDR2,那么显存的大小到底多少才是合适的,如何结合显存带宽来看待这个问题?
一些游戏在它的官方推荐配置里标注了显存容量,我们这个容量大致是怎么来的来看。
一般来说游戏的材质库占用较大的显存容量,一个游戏需要的显存容量是游戏的厂商通过一个30帧或者60帧(视游戏类别的不同)的画面,考虑到可能采用到的全部高分辨纹理加上这个帧数下的高分辨率画面的帧缓冲来估算,一般不考虑高倍抗锯齿的情况。
一般来说一个1080P的画面,算上高分辨纹理也不会占用512M以上的显存,特别是D9游戏,开启抗锯齿以后,像素部分的需求就会增大。
由于高分辨纹理在新游戏中的可以说是暴力的引入,加之用户对抗锯齿性能的渴求,主流显卡的显存容量是越来越大了,一方面是由于高频颗粒的引入,另一方面当然也得感谢颗粒价格确实也不高,还有就是为D11游戏准备的。
D11游戏的典型代表战地3,带来了华丽的光照效果,也带来了延迟渲染的广泛应用。
为了能够在复杂光照下实现对画面的抗锯齿,MSAA这种前端像素的边缘抗锯齿已经完全找不到北了,于是就自然转换成了用于对付透明抗锯齿才使用的方式,那就是SSAA,而由于这种多光源环境这种SSAA几乎是全屏覆盖了,所以官方建议使用FXAA而不是MSAA。
更主要的是这种暴力的SSAA带来的是对显存容量的渴求,以至于一些1G容量的显存都开始溢出,SLI/CF模式下需求则更大。
这里给出GPU建议显存容量
每64bit/8ROP搭配256MDDR3或者512MDDR5显存再高则收益极低。
多卡互联TIPS:
主卡显存容量未必如通常以为的那样需要远高于单卡模式,由于延迟渲染带来的抗锯齿帧缓冲压力是个特例。
主卡负责输出,也就是说只负责副卡的输出而不参与副卡的那一帧运算,所以所存储的数据量并不大,仅以需要输出帧缓冲为主。
某种意义上来说多卡互联方案应该优先考虑高位宽GPU,以避免开启抗锯齿以后像素输出出现瓶颈。
由于副卡不负责输出,所以它的功耗也低于主卡,大约是主卡的70%,所以SLI/CF平台的显卡功耗并不是直接×2,而是略低,从这个角度说多卡互联的能耗比还是很不错的。
未来,多卡互联方案会成为主流玩家都会考虑的配置方案,关于这一点的原因主要在于随着运算单元的暴增,线程的反派会愈加困难,而多卡互连会将一部分压力转移到CPU上。
第二节:
内核架构
1.基础性的解释
最早的统一渲染GPU并非G80,而是Xenos。
是由ATI为微软的XBOX360开发的,这个为ATI后面开发RV600奠定了基础。
其实由于ATI在单管三纹理上研发经验,他开发的统一架构就很容易偏向于SIMD结构。
实际上Xenos拖累了ATI的研发进度,导致了G80推出的时候RV600的研发仍在中段,直至RV670才初步解决ROP问题。
待此文创作之时,AMD的架构已经发生转换,所以只略微涉及R600的分析,而超标量体系则只分析NVIDIA部分,因为二者架构已经接近,没有必要再拆着说,对于VLIW的分析权且作为一种补充,这倒省了我不少精力。
G80一个经典的超标量图形加速芯片,而且其规格和缓存设计都非常合理,整体效率很高,现在简单的以G80为蓝本来描述,其后穿插我认为有必要的新技术改进说明。
所谓SIMD就是单指令多数据,这种技术也被应用于处理器的超线程技术。
像素是由RGB三种颜色构成外加半透明处理,还会加上一个A通道,因此一个像素通常由RGBA四个通道构成,这里的四个通道就是一个向量,称之为4D。
类似的例子还有三维坐标,通常是由x、y、z三个轴构成,有时候还会加上个w,也就是xyzw坐标了。
因此对一个像素进行渲染就是处理RGBA四通道数值,依靠SIMD单元,1D-4D的数据都可以依靠单个流处理器完成,而且只耗用一个指令端口。
这种设计有他的弊端,当面对纯1D指令环境的时候,这种设计的效率就会下降到25%,所以G80将其流处理器的频率提升至两倍核心频率以应对这个问题。
而且这种对ALU的彻底分离,也对寄存器和指令端口带来了严酷的考验。
从某种意义上来说G200和G110的性能都受到了指令端口的制约,单流处理器的执行效率反倒是G92最高。
我在这张G80图片上标注了一些注脚,不过不太清楚
G80的核心主要构成如下:
依托于crossbar交叉总线(其特点是较低的内存延迟和晶体管耗用,但相较于RINGBUS总线,其构建TPC数量方面则更显得困难,在多指令环境下也不如环路设计。
Ringbus的固有缺陷在于对纹理压缩有着较高的依赖。
ATI也在后来的芯片中放弃了这种设计。
反倒是intel把它拾起来用在了CPU上,CPU毕竟单元较少,这样链接点数量也在可控制范围内。
)G80构建了8个TPC也就是材质通道,每个TPC包含2个SM阵列,每个SM阵列内含8个超标量流处理单元,总共8×2×8=128个。
这些流处理器是主要的运算单元,依靠分频技术运行于两倍核心频率上。
每个SM阵列包含4个SPU(SpecialFunctionUnit特殊功能单元)单元对应着rcp,rsq,log,exp和lit指令的处理,这部分很多都是函数向的,更主要是为了通用计算设计的。
每个SM阵列包含8个纹理拾取单元和4个纹理过滤单元以及L1。
纹理拾取和纹理过滤单元并非同步运行,因为二者的负载不同,纹理拾取要依靠缓存来和纹理定址合作,但依旧存在同步率的问题。
总线上总共布置了6个64bit的显存控制器,每个显存控制器包含4个rop单元,同时每个内存控制器捆绑一个可编程片上缓存L2.这些设计都为CUDA运算打下了基础。
NVIDIA在G80的研发上是非常超前的,(且不说那个时候黄仁勋演的一出好戏,拿出一个36渲染管线的样卡,并声称不打算转换到统一架构,戏耍了一次ATI),CUDA的研发始于2001年左右,也就是说在那时nvidia就已经知道微软有将GPU改进到shader主导的意向。
NVIDIA超标量的优势就在于只要指令端口能承受首发压力,所有的单元都可以同时工作。
G80的设计思路中,每一个SM阵列只同时执行一种shader指令,以减少线程分配对上游电路的压力,这和R600完全依靠一个超级线程端来统一调度是截然不同的。
向量指令在SM一级被拆分给各个SP执行,SP拥有独立的寄存器和分派器。
每一个TPC内含2个SM,同时拥有2个MP(multiprocessor多线程处理器)每个MP具备warp(我们可以看作是端口),每个端口可以发射32线程,实际上是32粒子。
这看起来很多,实际上高峰时期这个线程调度能力也就刚好够用,如果片上缓存容量不够就更悲剧。
每个SM上有32K的页面是给MP用的,每个TPC还有32K的缓存,作为shared缓存,供应TPC内的SM共享数据。
每个TPC8KBGlobalmemory和外加8KBConstantMemory(全局存储和常量存储),G80还有一个128KB的二级缓存,这一切都是为了指令的高效率分配。
要知道GPU不具备CPU的分支预测能力,纯依靠一个具备512KB缓存的超级线程分配器根本无法满足如此规模的运算器的渴求(RV600128KBRV970的时候是512KB)
2.那些年我们追过的CUDA单元
积和熔加运算(fusedmultiply-add,FMA),是CUDA基本力量之一。
CUDA单元具备完整的整数和浮点单元,这种设计为CUDA实现FMA打下了基础。
所谓FMA就是将乘法的结果和累加器A的值相加,再存入累加器。
比如A=B×C+D
通过FMA此类运算可以单指令完成,而且CUDA还可以将卷积、矩阵、点积等更加复杂的运算拆分成FMA指令在完成运算。
如果从线程分配的角度来看,SM阵列中的CUDA单元在运算时实际被分成4个一组,这种设计至今未变。
关于warp的线程数和CUDA的数量关系,放到后文来说。
G200的主要改动就是每SM8SP,每TPC3个SM,共计10TPC,纹理单元扩充为80个。
SM共享缓存扩充为16KB受限于crossba架构,TPC数量增加不易,而采用多SM阵列的方式,也是出于对线程分派器压力的考量。
另外G200开始支持64bit的浮点运算,这个依靠多运算单元配合实现的,其实现方式反倒很类似于CPU。
G80之所以被称为超标量,就是因为其SP单元是全功能单元,1D-4D指令皆可以由一个SP独立完成。
当然问题也是有的,如果是4D指令,要么消耗4个SP来完成,要么一个SP运行4次来完成。
所以还有是效率低下的情况.NVIDIA的应对办法就是采用分频技术,将SP频率提升到2倍于核心频率来运行。
这个设计一直被沿用到费米时代,它的缺点就是一致了GPU本身频率的提高。
当nvidia试图制造能兼顾科学计算和游戏的庞大核心的时候,往往会遭遇到频率提升问题,更主要的是它甚至影响到了显存控制器的设计。
R600的问题
R600的规格
R600完全的SIMD设计,共计4个阵列,每个阵列16组SP,也就是64组,合计64×5=320个流处理器。
每组SP由4个ALU和1个ALU.transcendental单元,于一个仲裁器共同封装。
ALU.transcendental也就是全功能单元,在一些文章里称为胖单元。
这每组SP只能同时执行一个VLIM5,而VLIM5要依靠UTDP来组合,而每个SIMD阵列所处理的线程列表也是由UTDP来提供,这个列表是完整的,同时列表上的处理类型可以是不同的,这也是它的优势所在。
另外一个部分就是R600的的ZCompression压缩比提升到了16:
1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 王朝 图形 加速卡