【IT168评测中心】在前段时间我们在测试Quadro系列显卡性能的时候,出现过SPECviewperf性能过低的情况,现在我们知道这种情况是和一个“垂直同步”的选项相关的,不过,其背后的故事没有这么简单。
SPECviewperf 10:基于OpenGL的专业3D性能基准测试程序
实际上,垂直同步影响到性能不仅仅是在SPECviewperf下,其它程序上也有类似的情况。SPECviewperf是SPEC(Standard Performance Evaluation Corporation)的一个专业3D性能基准测试程序,它基于OpenGL(GL:Graphics Library),OpenGL是专业绘图领域常用的一种接口。这实际上,在Windows XP系统下,垂直刷新同步的影响对所有的OpenGL应用都会生效。
开放的图形接口:OpenGL
要搞清楚这个问题,要先从操作系统的驱动模型讲起,在Windows XP里面,OpenGL ICD(installable client driver)驱动直接与GPU硬件层会话,直接操控硬件并掌握所有的底层功能,如内存管理等也包揽在内。
Windows XP的Direct3D/GDI驱动架构
在XP中,3D窗口对于系统来说就像是在桌面上开了一个洞——因为通常的2D窗口使用的是GDI(Graphics Device Interface,图形设备接口,负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出),如Direct3D和OpenGL都是用了独立的输出路径。
以ATI为例的Windows XP驱动模型
在Windows XP中,Direct3D、OpenGL、GDI三种图形接口都需要厂商提供驱动程序来进行处理,并且,最终的混合工作也是由其负责——整个系统的显示速率都由驱动来控制。垂直同步的功能亦然。
Vertical sync垂直同步是涉及到显卡和显示器的一个概念。在CRT显示器中,显示器上的所有图像都是一线一线的扫描上去的(无论是隔行扫描还是逐行扫描),因此显示器都有2种同步参数——水平同步和垂直同步。其中,水平同步信号决定了显示器画出一条横越屏幕线的时间,垂直同步信号决定了显示器从屏幕顶部画到底部,再返回原始位置的时间。换句话说,我们可以将垂直同步的数值理解为CRT显示器的刷新率。
刷新率只是次要,垂直同步的重要作用是确保显示区域处于空白、可刷新状态,这样才可以充填显示内容。在不同步的情况下会发生同时渲染多个不同的帧的情况,它会引起画面“撕裂”等各种不自然的情况。对于CRT和LCD来说都是一样。
在WIndows XP的驱动模型下,当开启垂直同步时,显卡渲染完成某一图像之后,在没有垂直同步信号到达前,显卡无法绘制下一帧,这自然限制了SPECviewperf的性能。而在关闭垂直同步的情况下,图像是能多快就多快地声称。实际上,SPECviewperf是要求在Windows XP下关闭垂直同步的。
在拨开垂直迷雾 榨干Quadro显卡最终性能里,我们测试了Windows XP Professional x64系统下的垂直同步选项的影响。Windows XP Professional x64系统和Windows XP Professional x86并不是基于相同的代码树,它基于Windows Server 2003 x64,不过,同样为XP系统,它们的大架构确实是一样的,如驱动模型,如垂直同步的作用方式。
SPECviewperf 9
SPECviewperf 10:开启垂直同步
SPECviewperf 10:关闭垂直同步
SPECviewperf 10:关闭垂直同步
SPECviewperf 10:关闭垂直同步
可以看出明显的差别。
到了Windows Vista下,情况又有所不同:微软在Vista中引入了新的Aero桌面UI和全新的显示驱动模型,不仅极大地改变了用户体验,对与OpenGL的内在影响也非常巨大。Vista是原生支持OpenGL的,这对微软来说是一个巨大的改变。
Windows Vista的一个重要特性是Aero用户界面,它提供了透明度、混合等窗口功能,以及动画图标、程序画面预览等特性,实际上,Aero本身就是一个3D应用程序,它需要GPU具有一定的3D能力并和其紧密集成。Windows Vista通过DWM(Desktop Window Manager,桌面窗口管理器)来提供Aero的底层支持。
为了得到最终的合成桌面,所有窗口的3D内容(OpenGL或Direct3D)都要发送到DWM,由DWM混合得到最终的显示画面。DWM下,GDI不再提供硬件加速,而是通过CPU来完成)。Windows Vista同时提供了一个新的显示驱动模型来支持新的变化(使Direct3D和OpenGL处于对等的地位),新的WDDM(Windows Display Driver Model),或者叫做LDDM(Longhorn Display Driver Model)将会在Aero打开的时候提供3D窗口混合功能(无论是使用Direct3D还是OpenGL接口)。
Windows Vista下的WDDM驱动模型
WDDM提供了一个由Thunk Layer组成的防火墙,它这提高了系统整体的稳定性。在以往(如XP下),驱动程序直接与GPU硬件层会话,并掌握诸多底层功能,这很容易引起问题,现在由显卡驱动带来的问题不太容易影响到整个系统(当然,问题还是有的)。此外,WDDM还改变了图形API的工作方式,以往如显存等资源由驱动程序控制,现在则统一交给操作系统管理,又比如在多个程序运行时,OpenGL ICD可以为每个程序都提供最大的材质存储空间,并且由Vista负责分配资源和管理调度,从而提高系统资源的整体利用效率。当然,由于每个程序都配置了独立的显存,这样内存占用会有所增加。
停止响应的显示驱动程序
由于Vista管理着提供给内核层的显示命令缓冲区,因此现在可以通过OS检测显卡故障,通过Vista的TDR(Timeout Detection and Recovery,超时检测恢复)功能,若一个显示命令2秒内得不到执行,那么Vista就会重置图形芯片和恢复显卡驱动。并进行如图上的提示。
现在Vista下,DWM管理着最终的输出效果,驱动程序已经无法直接对最终输出的桌面进行操作,而代之的是一个输出队列。每一个程序都具有自己的输出缓冲区,如下图所示,实际上Aero就是将所有窗口的提交的最终画面通过3D变换再输出:
Aero效果;Alt-Tab的任务切换效果类似
新的DWM模型对OpenGL,或者说,对我们的SPECviewperf有什么影响呢?
它影响了OpenGL垂直同步的工作形式。在以往,垂直同步影响着显卡生成内容的速率,这影响了OpenGL应用的性能,而现在在Vista下,所有的应用程序之间都是“垂直同步”的,因为如果不同步的话,不同帧率的应用程序会非常容易出现各种画面异常。在画面生成速率快过显示刷新率的情况下,有两种方法可以得到正常的画面效果:
第一种方法是限制窗口内容刷新速率为显示刷新率,实际上就是强制开启垂直同步。第二种方法是只显示在同步信号到达的那一帧,并丢弃所有其他的帧,这种方法的好处是不会限制住应用程序生成图像的速度,因为并不是所有生成的图像都会显示出来。Windows Vista DWM实现了后面的那种方法。
Vista下的SPECviewperf:开启DWM和Aero,垂直同步选项不再重要
基于架构上的改变,垂直同步的意义在XP上和Vista上就显得很不同,在XP上,打开垂直同步将会限制内容生成的速率,在Vista上,打开垂直同步不过是限制了画面刷新的速率,显卡尽可能快地生成了图像,只不过只有对应的帧才会显示出来。也就是说,在Vista下测试3D性能的时候,你不需要像XP那样特地关闭垂直同步。只有在需要进行XP和Vista对比的时候,你才需要关闭DWM(从而也关闭了Aero效果)。这个情况并不符合实际用户的情况:大部分用户都使用DWM和Aero。对于Vista来说,关闭DWM的测试是没有意义的,也不符合SPECviewperf的目标:得出真实环境下的图形性能。
(完)