AMD新一代图形API Mantel浅析
- 来源:微型计算机 smarty:if $article.tag?>
- 关键字:AMD,Mantle smarty:/if?>
- 发布时间:2013-11-22 10:51
这是一场与众不同的产品发布会,除了Radeon R9 290X、280X等重量级显卡新品相继亮相外,AMD还带来了一个让人好奇的“馒头”;与你每天早上吃的馒头相比,这个“馒头”可谓非比寻常,虽然不能拿来吃,但它却拥有将3D游戏性能最高提升9倍的神力。下面就让我们揭开这个“馒头”的神秘面纱,看看它是否能合您的胃口?
别意外,AMD目前当然不会改行从事食品行业,这个所谓的“馒头”不过是A饭们为AMD最新技术Mantle取的爱称(Mantle在英文原意为地幔之意,其发音同中文馒头读音较为接近,因此被A饭们叫做馒头)。与AMD针对显卡本身设计的CrossFireX、VLIW4技术不同,Mantle更类似于TressFX头发渲染、曲面细分技术——通过软件技术来发挥硬件的性能,带给玩家更好的游戏体验,不过其作用、功能要强大很多,因为它不再是表现硬件技术特性的某段代码,而是可以通过它完成整个游戏设计的图形API。
我们知道,自DirectX 9发布以后,微软的DirectX已基本取代OpenGL成为众多游戏主要使用的API。而随着技术的发展,在进入DirectX 10、DirectX 11时代以后,DirectX API乜表现出了很高的品质,通过DirectX API设计的《孤岛危机3》、《战地3》等游戏均表现出了接近电影级别的画面,那么AMD为什么要另辟蹊径去开发一种新的图形API呢?
原因并不复杂——为了提升效率。传统的高层图形API为了方便开发人员编程,将底层硬件的细节进行了层层封装,使得开发人员能够摆脱底层硬件细节的困扰,降低了开发难度与学习成本,同时也使得开发者们所编写的代码能够跨平台、跨设备地运行,DirectX便是这种设计哲学的代表者。这种高层图形API在便利了编程的同时,也付出了性能上的代价,高层图形API所经历的层层封装,每一层都代表着一次额外性能开销。让我们举一个简单的例子:每次访问缓冲区,高层API都会做一些额外工作,比如检查一次参数是否越界,访问类型是否正确等等,而底层的API则会把这些工作都交给程序员自行完成,自然加快了自己的调用速度。当然,实际的API封装远远不止参数检查这么简单,但是这个例子能够为我们呈现Mantle的基本设计理念——去除封装,暴露底层。 去除封装,暴露底层的设计理念并非灵光一闪的做法,它的提出由来已久。高层图形API带来的额外开销在实时渲染领域的评价用“又爱又恨”来形容是很贴切的,一方面它方便了开发人员编写代码,另一方面却又限制了电脑性能发挥,阻碍性能提高的最大瓶颈就是绘制调用(draw call)次数的限制。一次绘制调用相当于在屏幕上一次性绘制一批渲染条件相同的物体,每进行一次绘制调用,CPU都要花费一定时间准备数据并呈递给GPU。一个漂亮华丽的复杂场景需要绘制许多渲染条件不同的物体,这就要求进行许多次状态不同的绘制调用,使得CPU为了准备渲染数据而不堪重负,而GPU则持续空闲。在DirectX上,如果渲染一帧像素数目很多但是着色并不复杂的图像,额外开销近乎于0,但是到了三角形密集的场景,且绘制调用无法组合打包的情况下,性能就会大大衰退。NVIDIA的评估表明,在每次绘制调用舰模不大但次数频繁的情况下,吞吐量的大小并非取决于GPU的强大并行能力,而是取决于CPU向GPU提供待处理数据的速度。这一问题在开发人员当中已是怨声载道,当下的开发者们被迫限制了自己进行绘制调用的次数,而游戏引擎也需要对绘制调用打包合并,进行优化。这一问题也对DirectX的缔造者微软公司施加了巨大压力,DirectX10的开发组也在这个问题上下了功夫。相对于DirectX 9,DirectX10与DirectX1 1两次大的版本更新都加入了针对性的改进,但是问题仍未得到根本解决。
相对于庞大复杂的DirectX来说,Mantle仅由轻量级的API与驱动程序组成,并且与逐层封装,远离硬件的做法不同,Mantle反其道而行之,极力贴近硬件底层,将硬件底层特性暴露给上层的程序员,令开发者能够对渲染过程有最大的控制权。通过减少高层API在CPU上带来的负担,AMD宣称Mantle能够让每帧图像所允许的绘制调用次数猛翻九倍,大大减轻了绘制调用瓶颈带来的影响,这是一项具备相当诱惑力的优势。
虽然现在我们暂时还无法得知使用Mantle后到底会带来怎样的优势,但从另一个平台的表现上,我们可以初见端倪,那就是漪戏主机。我们知道,游戏主机中配备的GPU,其绝对性能比PC平台的旗舰级GPU有着档次上的差距,Xbox 360的GPU尚不及PC平台旗舰级GPU性能的十分之一,但为什么游戏主机在保证游戏流畅运行的同时,仍能呈现较好的画质呢?
这是由于游戏主机的程序代码与专注于高层API的PC游戏代码不同,游戏主机的硬件固定,高层API所提供的跨设备优势不再具有意义。因此为了从有限的硬件资源中榨取最大性能,在游戏主机上往往共同使用高层与底层API,而这大大提升了游戏机的运行效率。举例来说,在使用相同硬件的环境下,在游戏机上进行10000-20000次绘制调用时,游戏帧速仍能保持30-60fps,而在PC的DirectX环境里,则只能使用2000-3000次绘制调用才能保证游戏的运行帧速达到30fps左右。
性能上的提高固然诱人,但需要注意的是,去除封装的招数犹如杀敌一千、自损八百的七伤拳。底层硬件直接呈现意味着代码通用性的丧失,过分靠近硬件底层的Mantle仅为AMD GCN架构的显卡优化,仅有在GCN架构的显卡上才能够享受Mantle带来的好处!这意味着只有Radeon 7000系列以及新近的Radeon R7写R9系列能够打上Mantle标志,而AMD那些并未采用GCN架构的前代产品,以及竞争对手NVIDIA和Intel的产品,都被排除在Mantle的优化范围之外。Mantle所带来的优势仅能够在GCN上化为现实。这意味着游戏开发者们面临着艰难的抉择:若是选择纯Mantle进行开发,自己的游戏就等同于与AMD捆绑在一起,成为一条绳上的蚂蚱,使用KIVIDIA显卡和Intel集成显卡的玩家将与自己的游戏无缘。若想顾及GCN显卡用户以外的市场,就必须花费额外精力,将程序转移到DirectX基础上,实现通用,或是先开发基于DirectX的通用版本,再开发基于Mantle的AMD GCN显卡特别优化版。而说服这些开发人员付出额外精力学习Mantle,并使用Mantle进行开发的诱惑力,便在于性能上的提高。这时候再回头看Mantle的优点,就显得不那么超凡脱俗了,是否要选择Mantle,还真得斤斤计较一番。AMD若是足够明智,那Mantle的设计就不能为DirectX的迁移带来重大障碍,以方便开发人员选择第二条路线——在DirectX与Mantle之间进行代码迁移。可能有读者会问,Mantle能不能干脆取代DirectX,游戏统一使用MantleAPI耒开发呢?
能够吸引开发者的支持吗?
对于游戏玩家来说,显卡的性能和价格是最重要的两个因素,甚至可以说这两个因素就是玩家关注的全部,但从程序开发员的角度上看,性能的地位便有所衰落,从“最重要的因素”变成了“重要因素”之一。举例来说,当我们需要在屏幕上实时绘制一个以Sin函数轨迹持续运动的发光小球时,那么程序开发人员可能面临多种选择:其一,使用Java/C++等语言配合图形库来开发,这样的话程序员能够控制一些底层硬件的细节,例如使用分块访问来提升访存局部性,消除数据相关性,帮助编译器和处理器进行单指令多数据流加速等,性能有所保障,但是编程难度较大,所需时间相对较长,完成这项工作可能需要个把小时的编程与调试;其二,使用专用的数学绘图工具,例如Matlab.Mathematica等进行绘制。这些专用数学绘图工具通常使用C/C++再搭配更高抽象层次的语言编写,底层硬件的细节被完全遮盖,程序员已经无法感知硬件特性,这类软件的运行性能相比单纯的语言开发会有数倍的衰退。但程序员的选择却令人意外,性能上的大幅落后换来了另一方面无可比拟的巨大优势——完成这个编程任务将只需要一行指令,编程仅需区区一分钟,因此这些专业绘图软件受到许多程序员的青睐,成为绘图任务的首选。
从这个例子中我们可以看到,性能方面具备数量级的领先优势未必能够吸引开发者,开发所需的时间和精力成本,以及开发者们学习这套额外API所需的学习成本也是不可忽视的重要因素。能够提供大幅性能优势,但同时又以较高的开发成本而“臭名昭著”的莫过于手工汇编。如果实时渲染领域只凭性能优势说话,那么所有的开发者早就一拥而上使用汇编程序开发游戏了。因此光凭性能优势,MantleAPI还不足以吸引程序员们去付出额外精力。Mantle还必须拥有优良的设计,对开发者友好,学习和迂移成本越低越有利,这样才能获得程序员们的支持,它的成功=性能显著优势+较低的学习成本+较低的开发成本,三者缺一都会为Mantle的未来添加不确定性因素。
好消息是,寒霜3引擎技术总监Johan Andersson已经率先表示,至少有《战地4》、《镜之边缘2》、《星球大战:前线》。《极品飞车18:宿敌》、《质量效应》等15部采用寒霜3引擎的游戏大作将会采用AMD Mantle API设计。初步看来,Mantle的入门成本似乎不高,已经吸引了主要游戏大厂的注意。
当然,推论Mantle取代DirectX的设想还是太过大胆了,从现实情况来看AMD也没这样的考虑。不论是主导一种标准还是推翻微软的领导地位都是非常艰难的,同时新一代Radeon R9/R7显卡也是明确支持DirectX11.2标准的,AMD肯定离不开通用的标准。我们认为开发Mantle API更多地还是为了促进AMD与游戏开发商间的合作,更好地对游戏进行优化。
最后,还有一个大家最关心的问题,在PC游戏中,Mantle API到底能带来多大的提升呢?将绘制调用的允许数目提高了九倍,那么实际性能就会提高九倍吗?显然不是,绘制调用的上限大幅度提高之后;性能瓶颈显然就已经不在绘制调用的部分,而是转向了“砌墙工人J’即GPU。我们知道,高端GPU与入门级GPU之间在技术规格上存在巨大的差距,因此使用Mantle并不会让一块五百元的低端显卡瞬间碾压数干元的旗舰显卡。Mantle只是在理论上,在几何负载密集、多个着色处理的场景下可以带来一定幅度的性能提升,不要对Mantle抱有不切实际的过高期望,单纯使用Mantle并不会带来性能上奇迹般的突破。根据最新消息,AMD将在本月召开的开发者大会上公布关于Mantle的更多资料,届时可能将有测试数据放出。本刊也将对其持续进行关注,在后续为大家带来有关Mantle的深度报道。