MCPLive > 杂志文章 > 回归底层开发 DirectX 12技术预览

回归底层开发 DirectX 12技术预览

2014-06-10李实《微型计算机》2014年5月上

微软终于发布了新版3D图形API——DirectX 12,这将会为3D技术的发展带来哪些好处?对玩家平时进行游戏又将产生哪些影响?

时隔整整4年半,微软终于发布了新版的3D图形API——DirectX 12,与显卡这种我们可以看得见的硬件技术指标增长相比,DirectX 12将会为3D技术的发展带来哪些好处?对玩家平时进行游戏又将产生哪些影响?

在2014年的游戏开发者大会(GDC 2014)上,一个令人兴奋的消息让所有的PC游戏玩家为之关注,那就是微软正式发布了DirectX 12 API。也正像之前微软暗示的那样,DirectX 12将注重提升3D图形底层的运行效率。不过目前由于其相关技术信息比较少,大量的细节还没有披露,因此本文将暂时从已有的资料中,为大家梳理一下DirectX 12的重要改进之处,以及DirectX 12对整个IT行业可能带来的影响。

回归底层开发 DirectX 12技术预览

为什么要从底层开始?PC<游戏主机

有关图形编程的底层效率的内容,在过去的六个月中已经成为热门的公众话题,尤其是AMD在推出了诸如Mantle这样的API后,底层优化对效率的提升再次成为焦点内容。出现这样的情况并非偶然也并非一朝一夕,而是整个PC业界长期以来的酝酿和技术进步所累积的。在长达几年的发展后,终于以这样的形式爆发了出来。

那么,为什么大家都将目光集中在PC的底层图形进化上呢?简单的答案就是——性能,更具体一些的答案则是,底层开发能带给我们非常多的优势。图形底层的改进和开发并不是什么新鲜的话题,绝大多数游戏机设备都是通过这样的方式来获取更强的性能——这基于游戏机本身是一个固定的平台,因此很容易做出针对性的开发。通过硬件和底层程序开发人员的努力,游戏机往往可以得到与其硬件性能看起来似乎完全不匹配的实际图形效果表现,尤其是与类似甚至更高配置的PC相比,游戏机的效率简直令人难以置信。

然而,随着个人电脑的快速发展,行业很快就为个人电脑设计了大量高级API,比如DirectX和OpenGL,通过这些高级API,PC兼容了更多的硬件并且获得了不错的图形效果。也正是在这个发展过程中,图形API完成了统一化,那些在DOS时代出现过或某些特殊用户使用的图形API已经销声匿迹,统一的图形API使得个人电脑使用更为方便,性能表现也令人满意。

经过如此多年的发展后,情况发生了一些改变,在使用过程中,人们发现这些高级API可能存在一些问题——正如AMD的Mantle所展示出的那样。简单来说,在这些高级API发展的过程中,CPU和GPU的硬件性能也发生了改变。相比之下,CPU的单线程性能已经很难得到提升,其主频也达到了一个很高的地步,继续提高CPU的主频将越来越困难并且会耗费大量的电能,之前通过简单的架构改进就能轻松提高的IPC也变得举步维艰。但在GPU方面,由于图形计算的并行特性,其性能一直在大幅度攀升。

终结果是,当我们考虑CPU的单线程性能增长幅度时,才发现GPU已经远远将其抛离——这本身可能未必有什么问题,但在使用DirectX和Open GL这类高级API的时候,情况可就大不一样了。这些API在为GPU准备数据时的工作基本上都是调用单线程的CPU运算资源,然而由于CPU单线程性能增遇到瓶颈,因此就产生了差距。也正是由于这种差距的产生,大量的时间被浪费在GPU等待CPU上,也就导致图形性能的提升难以跟上GPU的硬件发展步伐。

而如果通过底层开发来设计游戏,那么相比高级API,底层开发对这种困境要更为“适应”一些。底层开发依旧需要一个CPU主线程,可能会发生瓶颈,但是底层开发往往不使用受制于CPU性能很严重的API,并且底层开发不需要CPU为GPU预先准备数据,因此底层开发更容易使用多个CPU并行处理,并预防瓶颈现象的出现。这也就是很多游戏机为什么使用相对弱小的多核心CPU也能实现与高性能PC匹敌甚至更好的游戏效果。

出现这种情况后,使得人们需要更为认真地评估目前的API在个人电脑上的使用情况,游戏开发者和厂商都需要更为强悍的性能。此外还有一个比较偏激的观点是,为了尽可能地减少全新一代游戏机对PC游戏的威胁,至少PC游戏在软件发展方面需要尽可能地跟上游戏主机。目前的情况是,电脑相比游戏主机,虽然依旧存在极为明显的硬件性能优势,但是考虑到种种已经存在的性能失衡以及瓶颈,终电脑上的性能表现甚至不会比主机更为出色。一台高性能PC的绘制调用数量甚至比仅仅价值400美元的游戏主机还少,这显然是不够合理的。

从Mac P ro的CPU与GPU近7年来的性能发展趋势来看,GPU性能的提升速度显然要比CPU快很多。
从Mac P ro的CPU与GPU近7年来的性能发展趋势来看,GPU性能的提升速度显然要比CPU快很多。

提升CPU多线程效率为主 深入DirectX 12内部

正是基于以上原因,微软带来了新的DirectX 12,这表示微软开始真正重视改善底层程序运行效率的情况了。不过现在距离DirectX 12正式发布还有将近18个月,因此,微软暂时没有公布非常详尽的技术细节,下面就让我们通过微软公开的发展计划以及部分内容,一起来了解一下DirectX 12的大致情况。

从一个比较高的层面来看的话,DirectX 12很像AMD已经发布的Mantle,微软设定了一个和AMD Mantle基本相同的目标,那就是尽可能改善CPU-GPU体系中的瓶颈现象。这其实并不奇怪,终DirectX 12很可能带来和Mantle类似的效果。

细致地来看一下,和Mantle相同的是,DirectX 12的目的是大幅度降低CPU在整个CPU-GPU过程中的计算开销。CPU目前耗费时间多的部分是为GPU准备命令列表并存储至缓冲区,在DirectX 12上,这个任务将交给开发人员而不是CPU,也就是说开发人员将预先准备好这些内容,并将其分配在不同的CPU核心上完成,这将极大程度地提升CPU的运行效率。

为了达到上述目的,微软推出了一些新的概念。比如Bundle,也可以称之为“命令束”,这是一种可重复使用的功能与命令的列表。命令束的出现节约了CPU资源,因为提交一个命令束而不是大量的命令列表将更为直接、简单。在具体的执行中,可以允许命令束一次提交、多次执行,每次执行中可以有一些细微的不同。微软还给出了一个使用案例,其中的角色绘制工作在两次调用中使用了不同的纹理,展示出命令束在使用中的灵活性。

此外,DirectX 12还引入了管线状态对象(pipeline state objects,简称PSOs)技术,在这个新技术的帮助下,采用底层开发的程序可以真正深入命令缓冲区的执行过程,并且根据各种图形架构的差异采用高效率的执行方式。但是目前大多数的DirectX 11硬件没有加入管线状态的自由转换能力,所以要想进一步发挥新技术的能力,微软还必须考虑DirectX 12如何在新的功能和旧的硬件之间进行平衡的问题。当然,解决办法还是有的。PSOs可以绕过目前的管线限制并重新创建新的对象,具体细节目前暂时无法得知。总体来看,该技术的优势在于可以进一步降低CPU开销、提高效率、增加CPU的绘制调用数量,并且可以为其他任务释放运算资源。

另外一个在DirectX 12中需要提及的内容是Descriptor Heaps,可以称之为描述符堆积。在2012年NVIDIA发布开普勒架构的G PU时,曾经推出过一个新的技术,叫做Bindless Texture——无限纹理。我们知道在图形处理过程中,所有场景及物体表面的颜色细节都是由纹理和着色共同完成的,其中纹理负责完成大面积的颜色表达,而着色则负责局部颜色表现的修饰过程。在传统的图形处理中,纹理和着色存在一个Bind绑定的关系,一组着色代码只能对应128组纹理。不过在开普勒架构中,NVIDIA取消了这个绑定,一组着色代码可以无限制地访问高达100万组纹理。这不仅大幅提升了可被同时进行处理的纹理数量,降低着色代码被重复执行的几率,还可有效减少对CPU的资源占用,提升GPU的运行效率。

DirectX 12也引入了一些目前显卡上的新功能,比如源自NVIDIA的无限纹理技术,可减少对CPU运算资源的占用。
DirectX 12也引入了一些目前显卡上的新功能,比如源自NVIDIA的无限纹理技术,可减少对CPU运算资源的占用。

目前看来,新的描述符堆积技术就是将无限纹理技术整合到了DirectX 12中,DirectX 12也可以执行类似无限纹理技术的操作,同时扩大着色代码可用资源的数量,甚至使用完全动态的资源索引。后,DirectX 12还将支持JPEG图像压缩技术与ASTC(Adaptive Scalable Texture Compression)自适应纹理压缩技术。其中ASTC已在嵌入式3D API Open GLES 3.0,以及Mali-T600系列嵌入式GPU中得到使用。相对常见的ETC、PVRTC、S3TC等压缩技术,ASTC拥有更大的压缩比率,并能提供更好的显示质量,支持广泛的图像格式,已经被OpenGL列为核心标准的一部分。

分享到:

用户评论

用户名:

密码: