沧海桑田话存贮 内存/显存发展编年史
显存和内存的功能其实十分相似,内存服务于CPU,系统进程和常用资源都是暂存在内存中,因为速度带宽快于其他存储介质,可以最快的和CPU交换数据提高整机性能,显存也一样,不同的是它服务于GPU,而且比内存速度更快,一般来说,显存中所存储的数据主要由以下5部分组成:帧缓存(Frame buffer)、后台缓存(Back buffer)、Z轴缓存(Z-buffer)、纹理数据和几何数据。
简单的说帧缓存里存放的就是我们实际将在屏幕上看到的内容,这部分的容量计算方式大致为:屏幕宽度方向上的像素数目×屏幕高度方向上的像素数目×每个像素所用的字节数量,也就是显示分辨率的大小。
后台缓存顾名思义,就是第2帧缓存。当屏幕上显示出当前帧缓存的内容时,下一帧的显示内容已经被存放在后台缓存里了。而当后台缓存的内容显示时,帧缓存则写入第3幅画面……如此交替工作。因此,后台缓存的计算方式与帧缓存完全相同。但是后台缓存使用量可能会比帧缓存还要大,尤其是在游戏中FPS很高时!
Z轴缓存用来记录像素到屏幕的距离,这样当两个显示区域中的像素在屏幕上重叠时,如果新绘制的像素其Z值比Z值缓存中记录的数据小,那么就不必重新绘制此像素。这可以减轻GPU的计算量。类似于帧缓存,Z轴缓存其容量计算公式为:屏幕宽度方向上的像素数目×屏幕高度方向上的像素数目×每个像素Z值缓存所用的字节数量。
纹理数据以及几何数据因程序而异,涉及的方方面面非常复杂,无法定量计算。
● 显存在游戏中的使用情况更加复杂:
以上几项分析都是在没有打开FSAA(全屏抗锯齿)的情况下做的原理解析。实际上FSAA由于要进行多倍取样,因此程序所需的显存容量理论上将成倍增长。只有更高的显存容量和传输位宽,才能够满足GPU的需要。另外,近几年3D图形技术发展迅猛,HDR、Tessellation、各种阴影渲染成了游戏必备,DX10/11这些新的特性将显存的需求拉至顶峰!
总而言之,显存容量决定存储图形数据信息的多少,构成显存容量的几大部分当中,帧缓冲数据和Z缓冲数据的大小在同一款游戏中一般是固定的,所占用的显存容量并不是很多,而纹理数据大小占据了相当大的一部分,而且随着渲染画面的复杂程度和抗锯齿多倍取样等特效,GPU对显存的需求会大幅波动!
▲ 12款游戏显存占用率总结
测了一大堆游戏,笔者根据经验谈一谈游戏对显存的需求到底体现在哪,也顺便揭露几个误区:
1. 像Crysis和FarCry2这种画面很华丽的游戏,由于大量使用了高精度纹理贴图,显存消耗十分可观,但开发商也会比较收敛的将显存使用控制在高端显卡的物理显存容量范围内,所以大部分游戏的显存用量不会超过主流的1GB;
2. 像星际2这种屏幕内拥有大量物体,景物模型太多导致显存用量大增。由于这些单位都是由玩家亲手建造出来的,并不在开发商的控制范围内,因此显存消耗急剧膨胀。大容量显存是必须的,通过我们的测试来看,GTX460 768MB玩星际2时,场景稍微复杂一点就会很卡(特效全开+AA),而1GB版本也会在多人大混战时出现掉帧情况,所以拥有1GB+显存的GTX470/480还有特殊版本的显卡很适合追求完美画质的星际2玩家。
3. 抗锯齿毫无疑问是最消耗显存的图形技术。noAA和4xAA相比,在所有游戏中显存使用量都会增加20%左右,大概是100MB-200MB甚至更多。
4. 理论上来说提高分辨率会多消耗一些显存,但实际上并非绝对的,因为提高分辨率之后,由于游戏FPS的降低,显存内的数据更新频率放缓,使用量会有一定程度的减少,此消彼涨之后,其实显存使用量不一定会增加。除非由于CPU的限制提高分辨率后FPS并没有降低多少,或者分辨率增加好几倍,那么就会消耗不少的显存。
5. 本次测试最高分辨率定格在1920x1080,如果大家使用更高的2560x1600(分辨率是1080p的两倍以上),或者是组建三屏(三倍分辨率)还有3D系统(双倍运算量)的话,那么显存消耗量就另当别论了。事实上2GB版本的显卡正是为这些有特殊需要的用户而定制的。
在过去的十几年时间里,DirectX已经稳步成为微软Windows平台上进行游戏开发首选API。每一代DirectX都带来对新的图形硬件特性的支持,每次版本变更都能帮助游戏开发者们迈出惊人的一步,而从主流游戏内存占用测试来看,显存512M已经越来越落伍了,很多游戏的流畅运行都需要768M乃至更高容量显存的支持。当然显存胃口超过1G显存的游戏还是凤毛麟角,作为普通消费者多花选择些许预算选择1G的产品绝对是物有所值,但是目前没有必要为了一两款游戏而去追求更大容量显存。