在上期的CBS探索与发现节目中,我们已经揭示了AMD和NVIDIA双方自统一构架出现以来所推出的每一代桌面硬件构架与API的关系。从中不难发现,单纯以硬件设计的角度出发,NVIDIA的每一代构架都更加符合微软在对应的API中所提出的要求。在适应的API环境下,NVIDIA的硬件执行效率应该更高才对。实际上在微软推出的每一代DirectX SDK的runtime测试中,NVIDIA确实在各种场合大幅领先竞争对手。
然而,当场合一旦转移到游戏领域,情况就变了。事实上除了个别情况之外,我们并没有看到NVIDIA在大多数游戏中取得DirectX SDK测试上的领先幅度,这究竟是为什么呢?遵循CBS之眼的原则,本期CBS探索与发现节目将继续为您展现其中的奥秘,带您领略现象背后的真实。 ● 多边形,像素,纹理,流水线
要了解事情的真相,我们首先要带大家回顾一些最基本的东西,比如游戏画面和程序的构成。
作为最基本的要素,画面的构成其实很简单——覆盖在多边形表面的材质,以及构成材质颜色的像素。画面的形成过程要说复杂确实非常复杂,但如果以通俗的“人类语言”来解释其实也很简单——先用多边形搭好物体的“架子”,然后在上面蒙上一层作为“表皮”的纹理材质,最后用像素刷好颜色,mission accomplished。
基本图形处理过程 没错,我们每天都能看到的经由无数人以千万甚至亿为单位记得美元编写出来的,运行在以亿甚至十亿为单位记得美元开发出来的硬件上的游戏过程,其实就这么简单。很多事情就是这样,过程表面上看起来复杂无比,但实际上本质却简单的要命。
这里的本质甚至还不止您想象的那样只是游戏图形生成的本质,这还是图形流水线工作过程的基本描述。那些滚滚美元流淌所汇合成的极为复杂的过程,本质上的工作顺序也是这样的。
OK,既然已经基本上了解了游戏渲染的基本过程,那就让我们深入到过程之中,一边进一步了解为什么NVIDIA比AMD的构架更贴近API需求,一边看看这些过程跟所谓的真实有什么联系吧。
● 框架,脚手架,骨架,随便你怎么叫它
作为流水线的起点,多边形的生成是整个图形过程的起点。当顶点信息被送入流水线之后,硬件需要根据需求将顶点“连起来”变成多边形。完成这个工作的,就是我们所说的几何处理单元或者说几何引擎。生成顶点的工作一般都是由CPU来完成的,所以当固定数量的顶点被泵送到流水线之后,决定整个图形渲染效率的第一关就出现了,那就是几何引擎的效率。
一个标准的三角形setup过程 相比于后面我们要面对的环节来说,几何引擎的意义描述以及其效率的衡量标准要简单很多。更多的多边形有助于模型细节的细腻表现,而在顶点数一定的前提下,谁能够在单位周期内将更多的顶点绘制成多边形,谁的效率就更高。虽然伴随着着色器的发展,几何引擎中出现了诸如Domain Shader、Geometry Shader甚至是Hull Shader之类的单元,但是本质上来讲几何引擎依旧是以输出多边形为最根本任务的。
传统结构的顶点几何引擎 GPU经过十余年的发展,其本身的处理能力有了飞跃式的进步。但作为整个GPU最前端的单元,几何引擎的发展却一直不如GPU的其他部分来的迅猛。究其原因其实非常简单——作为图形过程的起点,构成多边形的顶点是由CPU生成的。
相比于GPU爆炸式的规模增长,CPU的发展明显更加缓慢。受限于频率压力、单位流水线效率压力以及摩尔定律导致的规模压力,CPU在过去几年里不得不向并行化方向去发展。但是长久以来一致困扰数学界的任务的无损拆解和网格化又成了限制CPU向并行化方向发展的重要因素。来自材料学,逻辑电路设计甚至是纯数学领域的压力使得CPU的发展举步维艰。
sandybridge的wafer照片 “得益”于“上级单位”的缓慢,长期以来GPU的几何引擎部分压力都不是很大,甚至自支持DirectX 10的GPU开始,几何引擎的多边形输出能力相对于CPU能够输出的顶点来说竟然已经到了绝对过剩的地步。因此在DirectX 11出现之前,不论是AMD还是NVIDIA,大家的几何引擎都没有值得大书特书的能够产生对效率起决定性影响的设计差异。
● 靠不了CPU,那我们就靠自己
CPU发展的缓慢并不是一时半刻可以解决的,即便是微软这种大号商人也没有办法。不过商人毕竟是商人,变通的处世之道帮助微软化解了很多看似无法解决的矛盾,这次也不例外。既然无法从CPU获得更多有效的顶点来描绘物体的细腻表面细节,那我们就自己想办法吧。于是,商人再次发威,DirectX 11引入了重要的几何处理过程——Tessellation。
DirectX 11 SDK的Tessellation组件 一个完整的Tessellation过程包含如下步骤:几何引擎自CPU得到初始顶点参数设置,然后将这些顶点连接成模型的初始框架。接下来几何引擎会开始读取跟随顶点参数被一起传送过来的程序中的Tessellation系数,其中包括细分等级以及修补参数。根据细分等级的不同,几何引擎中的Tessellator会计算新的顶点数量,然后再根据修补参数的要求,与几何引擎中的Domain Shader一起将新的顶点放置在正确的位置上。最后以这些顶点为基础,几何引擎会再次生成新的多边形。
Tessellation过程增加的细节 虽然过程看上去很复杂,Tessellation过程的本质其实依旧非常的简单。CPU送来的顶点先被连成多边形,然后硬件再在这些多边形中设置新的作为顶点的操作点,通过将这些新的顶点与原有的顶点相连把多边形“打碎”,完毕。
本质简单有一个好处,我们可以很轻松的从本质中抽离出过程所要的需求是什么。作为Tessellation过程来说,实际需求其实只有两个:负责根据Tessellation系数计算到底需要多少新的顶点并安置他们的Tessellator单元,以及多边形输出能力。
● 司马光?不,我们叫它短板效应
从几何阶段这里开始,我们将引入并且不停面对一个横亘整个体系并且导致了最终结局的重要影响因素——短板效应。
有人说司马光砸缸之所以名留青史是因为司马光自小有正义感见义勇为,也有人说这表明司马光从小就很聪明果断,知道不能用舀水的方式慢慢的将水放光于是当机立断把缸砸了。我以为以上都不对,司马光砸缸这件事最威武的地方,在于它是人类历史上第一次儿童自发的对短板效应应用的描述。
司马光与短板效应 试想一下,如果司马光拿起石头直扑缸口,一石头下去却没多少水流出来,结局会怎样么?司马光选择在水线以下把缸砸开,缸里的水位自然会降到破洞以下,这就是短板效应的真髓——体系中最低的位置永远都由最低的限制因素决定。
水尚且如此,显卡又会怎样呢?
让我们再试想一下,假定我造了一块显卡,里面有几百个Tessellator单元,每秒钟可以生成几百亿个新的顶点,然后几何引擎还维持每秒几百万的多边形生成能力,又或者把情况对调过来,几何引擎每秒钟可以输出几百亿个多边形,然后体系只有一个Tessellator单元来生成新顶点,结局会怎样?
答案很简单,等待。
这就是短板效应最无情的地方。在单进单出体系中,不论某个单元的速度有多快,体系的效率始终由速度最慢的那个单元决定。我们电脑中的传统硬盘就是很好的例子。
作为几何引擎来说,顶点和数据流进来,多边形流出去,这就是单进单出。要想让它快起来,要么解决最短的那块板子,要么改变单进单出的过程。从DirectX 11开始,几何引擎有了值得书写的东西。
|