在物理世界中,管线的概念以及不同的形式来证明自己,从工厂组装线到缆车,也被用在图形处理中。
管线包含了多个阶段[541],例如,在输油管道中,油料不能从第一个阶段到达第二阶段直到第二阶段中的石油已经移到第三阶段,等等。没意味管线的速度取决于最慢的阶段,不管其它阶段的速度多么地快。
理想情况下,非管线系统被分割成N管线阶段可以达到N倍的加速,增加性能提升是使用管线的主要原因。例如在缆车中只放一个坐椅是低效的,放置更多的缆椅可以成倍加速运送滑雪者到达山顶。管线的不同阶段并行地执行,但会被最慢的阶段拖延直到该阶段完成为止。例如,如果汽车组装线上的方向盘安装阶段需要3分钟,而其它阶段只需要两分钟,那么最快的速度是3分钟完成一辆汽车,在方向盘安装阶段完成之前,其它阶段必空闲一分钟。对于这个管线而言,方向盘阶段是一个瓶颈,因为它决定了生产的速度。
这种类型的管线在实时计算机图形中也可以见到,实时渲染管线可以粗略分为三个概念阶段:应用程序,几何图形以及光栅器,如图2.2所示。这个结构是实时计算机图形中使用的渲染引擎的核心,也是接下来的章节中讨论的根本问题。不同阶段的本身也是一个管线,这也意味着管理包含了很多不同的子管线。我们来区分概念阶段(应用程序,几何图形以及光栅器),功能阶段以及管线阶段的区别。功能阶段是指在管线中执行特定的任务,但未指定执行任务的方法。另一方面,一个管线阶段是指同时执行所有其它管线阶段,出于高性能的需要,一个管线阶段可以被并行地执行,例如,几何处理阶段可以被分为5个功能阶段,但图形系统的实现决定了被划分的管线阶段。一个给定的实现可能整合了两个功能阶段到一个管线阶段,同时也会将更耗时的功能阶段划分成不同的管线阶段来并行化之。
最慢的管线阶段决定了渲染速度即图像的更新速率,该速率可能被表述为帧率(fps),也即是每秒被渲染的图像数量,也可以表述为赫兹(Hz),更新频率1/秒的简化。应用程序生成图像的时间是变化的,取决于每帧执行计算的复杂度,FPS用来表达特定帧的执行速度,或者一段时间内的平均性能。赫兹用于硬件,如显示器,被设置为固定速度。因为我们使用管线进行处理,因此无法得到通过整个管线中所有被渲染数据的处理时间总合,当然这也是管线允许不同阶段并行执行带来的后果。如果能定位到瓶颈所在,如管线中最慢的阶段,测量数据通用该阶段所占用的时间 ,那么我们就可以计算得到渲染速度。例如,假设瓶颈阶段花费20ms来执行,那么渲染速度就是1/0.020 = 50 Hz,然而这个值只有在输出设备可以以这个速度进行更新的情况下才是正确的,否则正确的输出速度会被降低。在其它管线环境中,使用吞吐量(throughput)而不是渲染速度。
示例:渲染速度。假设我们的输出设备的最大更新频率为60Hz,并且已经渲染管线中的瓶颈,时间测量显示该阶段执行花费62.5ms,渲染速度的计算如下,首先忽略输出设备,我们可以得到最大的渲染速度 1/0.0625 = 16 fps,然后,调整该值到输出设备的频率:60Hz意味着渲染速度可以达到60Hz,60 / 2 = 30Hz,60 / 3 = 20 Hz, 60 / 4 = 15 Hz,60 / 5 = 12 Hz等等,这意味着我们可以期望渲染速度达到15Hz,因此输出设备可以管理的最大固定速度 小于16Hz。
正如其名,应用程序阶段受应用程序驱动,由运行中的软件在CPU上进行实现,CPU通常包含多个核心来并行执行不同的线程,这也使用CPU可以高效地运行大量应用程序阶段负责的任务。根据应用程序的不同,一些通常在CPU上执行的任务包含碰撞检测,全局加速算法,动画,物理模拟等等。下一步是几何处理阶段来执行变换,投影等等,该阶段计算什么需要被绘制,怎么绘制以及被绘制在什么地方,典型地,几何处理阶段在图形处理单元(GPU)上执行,GPU包含很多可编程的核心及固定功能的硬件。最后光栅化阶段根据之前阶段生成的数据逐像素计算绘制(渲染)一张图像,光栅化阶段完成在GPU上完成。这些阶段以及内部阶段在后面三章中会被讨论,关于GPU如何处理这些阶段的更多细节将在第三章中给出。