当前位置:文档之家› 游戏为何总是卡?人眼成像背后的秘密

游戏为何总是卡?人眼成像背后的秘密

游戏为何总是卡?人眼成像背后的秘密

2012年10月30日 00:00 出处:泡泡网【原创】作者:蒋尚文编辑:蒋尚文

1000年前老祖宗的智慧

泡泡网显卡频道10月30日公元1000年间汉人发明的走马灯也许是世界上最早应用到视觉暂留原理的东西了。灯内点上蜡烛,烛产生的热力造成气流,令轮轴转动,轮轴上有剪纸,烛光将剪纸的影投射在屏上,图象便不断走动。因为大多在灯各个面上绘制古代武将骑马的图画,而灯转动时看起来好像几个人你追我赶一样,故名走马灯。后来法国人保罗·罗盖在1828年发明了留影盘,它是一个被绳子在两面穿过的圆盘。盘的一个面画了一只鸟,另一面画了一个空笼子,当圆盘旋转时,鸟在笼子里出现了。

究其原理,物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象,是人眼具有的一种性质。人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会立即消失,而要延续0.1 -0.4秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”。

当年的宋朝人显然没有意识到视觉暂留的重大意义,时至今日,这种现象广泛的应用在人们生活的方方面面,无论是之前的CRT显示器,还是液晶或者等离子;无论是胶片,模拟信号还是蓝光,数字图像,无一例外用到了人眼的视觉暂留。

我们常说的“帧数”,就是在1秒钟时间里传输的图片的量,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。

关于“人眼不能分辨超过每秒30帧的画面

后来人们通过研究发现,高的帧率可以得到更流畅、更逼真的动画,要生成平滑连贯的动画效果,帧速率不能小于8;每秒钟帧数(fps) 愈多,所显示的动作就会越流畅,但与此同时,文件体积会变得越大。一般来说人眼能继续保留其影像1/24秒左右的图像,所以一般电影的帧速率为24fps。而对于帧数忽快忽慢的游戏而言,平均30帧也算流畅了。

有些视频甚至只有17帧

大家可能会问:既然对于人眼来说,游戏30帧就流畅啦,那干嘛还要到60帧,甚至是120帧?最近几年越来越多的人有这样的切身体验:明明平均帧数超过30帧大感觉依然远远不够,即使平均帧速率达到60FPS,依然不能杜绝卡顿的现象,这又是什么原因呢?

通过研究测试,我们发现这是因为游戏画面的帧数并不像电影那样间隔时间相等,而是忽快忽慢,所以肉眼观察出30帧以上的游戏,依然有卡顿现象完全可能!就这个话题,本文带大家一起探索游戏卡顿的秘密,揪出导致画面延迟的元凶!

游戏性能测试只测FPS是不科学的

之前的游戏性能测试,均是利用软件或者游戏自带的Benchmark程序,测试出一段场景内的最大最小平均帧数。一般来说这种测试方法可以反映显卡的真实性能,但并不完美。为了研究清楚上面提到的现象,我们引入了最近关注度比较高的另一种测试方法,来让显卡的测试更加科学——每帧生成时间测试。

测试方法就是使用我们的老朋友Fraps fps软件,在上面并不常用的Frametimes选项前面打勾。

这样测试完毕的结果是我们有了下面的数据:

黄色和灰色数据是Fraps软件自动生成的数据,绿色部分是我们通过一个简单的函数算出来的每帧生成时间。

我们选择了最新的高端的硬件配置,测试平台使用了Intel Core i7 3770K,8GB DDR3 1600内存和HD7850 毒蜥版2048M D5。

● 测试平台显卡:镭风HD7750毒晰版

镭风HD7750毒晰版采用了HD 7750显示核心,GCN架构,晶体管数15亿,性能较上代产品有着显著的提升,在显卡功耗和发热方面也控制的恰到好处。显卡支持DirectX 11.1、PC I Express 3.0和PC I-E 3.0。

● 测试平台主板:技嘉G1.Sniper M3

技嘉G1.Sniper M3是一款采用m-ATX板型设计的高端Z77主板,它结合了屡获殊荣

的G1.Killer设计理念,目标是给玩家提供强大的性能。无论是内建Creative专业级音效处理器、Sound Core3D高质感音效输出还是支持cFosSpeed 与网络加速技术的芯片,都是为了让玩家能有最棒的娱乐和联网游戏体验。

● 测试平台电源:Antec HCP1200

安钛克Antec HCP1200电源在世界超频大赛中非常常见,通过了80PLUS认证,转换效率高达92.4%,支持4路12V输出,最高电流72A,支持四卡SLI/交火。平均无故障运行时间为10万小时。配备一颗8cm静音风扇,运行噪音极低。

● 测试平台SSD:OCZ Vetrx3 240GB

OCZ的Vertex系列属于它的高端固态硬盘,专门为高端玩家和存储发烧友设计。随着Sandforce控制器大红大紫,OCZ也将V ertex系列升级到了全新的SF1200方案。如今SATA3.0 6Gbps接口大行其道,OCZ推出了基于SF2200系列主控芯片的Vertex 3固态硬盘,涵盖

60-480GB容量范围。

平均帧数60以上,依然可能会卡?

下面正式踏上我们的探索之路。

我打算选择一款要求比较低的DX10游戏FarCry2来测试,这款游戏自带Benckmark,

而且各种游戏特效选项一应俱全。测试设置如上图所示,DX9模式下,所有特效全部开到最高,包括8XAA。

第一次测试成绩图

第二次测试成绩图

整个测试过程生成了数千帧,本次测试我们考察了前一千帧数据,这个数据量已经足以说明问题。而两次测试相似的曲线也说明了亮点:

一、出现较大延迟并非偶然。

二、测试误差在可以接受的范围。

可以看出基本上每帧的生成时间都在10-15ms,但是极个别帧数冲到了20多毫秒甚至35毫秒秒以上!同样如果是大多数帧数在30-40ms,那有可能个别帧数会冲到100ms以上,如果在游戏中感觉到了卡顿,那么这些帧无疑就是罪魁祸首!

看到这里,前面的设想可以说得到了初步的验证。游戏卡顿现象终于揭开了面纱的一角。

现在我们离真相已经很近了,电影虽然只有24帧每秒,但由于每两帧之间的间隔均为1/24秒,所以人眼不不会感觉到明显的卡顿,游戏即使达到30帧每秒,但如果这一秒钟内,30帧不是平均分配,就算是每秒60帧,其中59帧都非常流畅,而有一帧延时超过1/24秒,依然会让我们感觉到明显的卡顿。请注意,这种情况下,最低帧数依然是60FPS!

哪些因素会造成单帧渲染时间过长?

那那些因素会造成个别帧渲染时间超长呢?

想要论证这个现象,首先有必要提一下游戏画面渲染的原理。和电影的顺序播放不同,游戏的帧数完全是实时渲染而成的。每一帧从生成到渲染完毕,过程非常复杂。

简单来说,先要生成三维图像模型(几何模型),将它们保存在自身的建模空间,然后通过模型变换将单独的几何模型移动到世界坐标系中,然后通过被称为“相机变换”的过程,将几何模型的世界坐标系转换为摄像机坐标。相机坐标的参数包括投影方式、近平面、远平面、视野和屏幕的长宽比例,它们决定了物体从相机坐标系投影变换到屏幕坐标系的位置。

这些参数实际上定义了一个视域四棱锥,也叫做视锥体。然后通过裁剪优化算法,通过投影到平面生成最初的二维画面。接着通过消隐、光照计算、纹理映射、颜色融合等光栅化操作来算出相对正确的像素颜色,呈现出凹凸感、阴影、景深等效果,生成最后的游戏画面。一帧画面的诞生,至少包含了上述所有步骤,而其中每一步出现问题和延迟,都会对最终成像速度造成影响。

了解了这些,我们可以大胆猜测一下,可能是其中某些环节的不正常迟滞造成了个别

帧渲染时间过长,最后导致画面卡顿,于是我们做了下面几组测试以求获知真相。

MODE 1画面参数设置

首先笔者怀疑是某些特效拖了后腿,火焰效果,物理加速和真实树这几个特效嫌疑很大,试想爆炸瞬间,如果火焰效果占用资源,或者物理加速和CPU的沟通延时这些都有可能是导致个别帧效率低下的罪魁祸首。

关闭了这几个特效,依然有几帧出现了夸张的延时,看来他们并不是关键症结所在,而罪魁祸首另有其人……

动态阴影实时渲染会延长时间?

MODE 2画面参数设置

众所周知,动态阴影的实时渲染是一项非常考验显卡的特效,问题会不会出在它身上呢?我们降低特效,采用MODE 2设置来测试,以期有所发现。

MODE 3画面参数设置

依然出现了不正常的延时帧,看来最有嫌疑的几种特效都证明是无辜的,或者说至少不是主犯,莫非一开始就想错了方向?但不管怎样,这次的测试应该有所收获了,因为有一种推演理论叫做排除法。也就是说我们犯的错误越多,离真相大白也就越近了……

游戏卡顿的罪魁祸首究竟是谁?

将特效分别调至高和低,出现了更多的异常帧。这说明了什么呢?说明我们依然没有找到延迟的问题所在,但我们离真相已经不远了,因为按照排除法,剩下的特效已经不多了。

我们将画质和AA都调至最低,仅仅保留所谓的DX10效果,这时候异常帧已经变得非常罕见,看来AA是让帧时间变长的重要原因,但它依然没有完全杜绝,那最后我们只剩下一线希望了,如果这一次依然无果,我们前面所有的努力都将变得毫无意义。

测试的最后,我们获得一份满意的答案,在开启DX9模式,不开启AA的情况下,我们终于获得了这样的一组光滑完美的曲线!

这意味着我们终于找出了让游戏卡顿的罪魁祸首——AA和DX10。这两种特效师造成目前游戏出现不正常延时帧的最大原因。

渲染效率延时两大元凶的前世今生

找到凶手并不是本文的终结,因为结案不光需要人脏俱获,而且要理清犯罪动机。正向推演出结论,下面我们逆过来解释一下为什么AA和DX10会让个别帧产生如此夸张的延迟,而导致游戏画面的卡顿。

● 罪魁祸首之一:抗锯齿(Anti-aliasing)

抗锯齿(Anti-aliasing):标准翻译为”抗图像折叠失真“。由于在3D图像中,受分辨的制约,物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体。它是提高画质以使之柔和的一种方法。

如今最新的全屏抗锯齿(FullSceneAnti-Aliasing)可以有效的消除多边形结合处(特别是较小的多边形间组合中)的错位现象,降低了图像的失真度。全景抗锯齿在进行处理时,须对图像附近的像素进行2-4次采样,以达到不同级别的抗锯齿效果。简单的说也就是将图像边缘及其两侧的像素颜色进行混合,然后用新生成的具有混合特性的点来替换原来位置上的点以达到柔化物体外形、消除锯齿的效果。

通过以往的测试,编辑认为抗锯齿对显存的容量和带宽、延迟都提出了很高的要求,虽然FarCry2这款游戏对显卡核心要求不高,但抗锯齿倍数过高造成频繁的像素采样,依然有可能堵塞存储堆栈,造成个别画面延迟异常。

● 罪魁祸首之二:DirectX 10

DirectX 10最大的革新就是统一渲染架构(Unified Shader Architecture)。DX9之前的各类图形硬件和API均采用分离渲染架构,即顶点渲染和像素渲染各自独立进行,前者的任务是构建出含三维坐标信息的多边形顶点,后者则是将这些顶点从三维转换为二维,这样便可以通过视觉欺骗在屏幕上显示出“三维”的场景。

微软在DirectX 10中提出了统一渲染架构的思想:在相同物理类型的渲染单元上执行不同类型的渲染程序。换句话说,只用一种渲染单元,让它既能完成顶点渲染,也能完成像素渲染,甚至还能实现几何渲染。这样一来,渲染单元可以得到最大程度的利用,减少了资源闲置的情形。但是,相对顶点渲染来说,像素渲染将面临大规模使用纹理所带来的材质延迟,这是统一渲染架构不得不面对的现实。

文章的最后,我们从理论上找到了问题的所在:不顾一切追求高AA和DX10特效,但目前显卡的架构并不能完全保证这些特效的流畅输出。我想这也是为何最为流行的FPS 游戏依然采用DX9C,而职业竞技选手也不喜欢高画质、高AA的原因。限于篇幅的限制,我们很难在此进一步探索不同硬件对超时帧产生的影响,本文的测试和讨论也只是揭开了渲染效率和画面质量之间矛盾的冰山一角。■

相关主题
文本预览
相关文档 最新文档