◆ 显存是做什么用的
在早期,也就是2D的时代,我们对于显卡并没有太高的性能要求,只要做到基本的显示功能即可,显示芯片(日后发展成为GPU)处理完的资料会传送到显存,然后进入RAMDAC单元完成数模转换,以便能让普通CRT显示器接收模拟信息。
事实上,显卡技术发展初期的焦点并非是显示芯片,也不是RAMDAC,而是像夹心饼干一样的显存。显存随时受显示芯片和RAMDAC两个差遣。显示芯片连续不停地更新显存里面的数据以保证画面变化,RAMDAC也源源不断地读取显存上的资料以维持画面的刷新。画面分辨率越高,从芯片传到显存的资料也就越多,而RAMDAC从显存读取资料的速度就要更快才行,为此显存必须在容量以及速度方面达到一定的要求。
当3D技术运用之后,数据量可谓呈几何数级上升,此时显存的速度和容量显得更为重要。
要使3D游戏更富真实性,需要进行大量3D运算,对纹理、贴图、帧缓冲等都要进行大规模处理,大量三角形生成、多边形处理也需要更大的显存工作空间来运作。因此,除了带宽外,显存的容量在很多时候就显得非常重要。为了渲染出更出色的高分辨率下的32位色的3D效果,研发者们在“显存”上也做足了功夫,比如纹理压缩、Z轴数据清理、动态显存分配、总线速度提升等。
在3D游戏运行时,显存中所存储的数据主要有帧缓冲、后台缓冲、Z轴缓冲、纹理数据和几何数据等几部分数据。
帧缓冲里存放的是将在屏幕上看到的画面,当屏幕上显示出当前帧缓冲的画面时,下一帧的显示内容已经被存放在后台缓冲里了,而当后台缓冲的内容显示时,帧缓冲则写入第3幅画面……如此循环。Z轴缓冲用来记录像素到屏幕的距离,当两个显示区域中的像素在屏幕上重叠时,当新绘制的像素其Z值比Z值缓冲中记录的数据小,就不必重新绘制此像素,以减轻GPU的负担。而纹理数据以及几何数据因程序而异,涉及的方面就非常复杂。
如果在3D游戏中打开AA或AF等选项,所需的显存容量理论上将成倍增长,像HDR、各种阴影渲染等一旦打开,对显存容量就更加渴求。帧缓冲数据和Z缓冲数据的大小在同一游戏中一般是固定的,所占用的显存容量并不是很多(几十兆而已),而纹理数据大小占据了相当大的部分,如果纹理缓存不够用,就会清空显存继续加载数据或调用速度较慢的系统内存充当显存,都会对显卡性能造成或多或少的影响,出现FPS下降甚至画面停顿的现象。
3D技术发展到今天,已步入DirectX 10时代。在过去的十年中,每一代的DirectX都带来对新的图形硬件特性的支持,因此每次都能帮助游戏开发者们迈出惊人的一步,尤其DirectX 10是自DirectX诞生以来,首次进行的一次彻底的重新设计。
在DirectX 10中,提供了对纹理阵列(Texture arrays)的支持,在每个纹理阵列中,最多可以保存512张同样大小的纹理。而且每张贴图的分辨率被扩展到了8192×8192。更大的分辨率意味着纹理中更丰富的细节。在一个shader中能够同时访问的纹理个数被增加到了128个,也就是说在每次执行同一个shader时,可以使用一个纹理阵列的512个纹理中的128个。所以说,在DirectX 10中,纹理的多样性和细节程度将会有大幅的提升。另外,DirectX 10为游戏开发者提供了很多新的特性,采用这些特性可以用来开发大量的次世代图形效果。
这一切,是对新生代显卡的挑战,其实也是对显存带宽和容量的一种考验。