【libgdx】RAM与VRAM的解释
libgdx吧
全部回复
仅看楼主
level 5
alwaystiys 楼主

在先前的好几篇文章中,我提到过VRAM(显存)的概念。但我发现这个概念依旧常常困扰着读者朋友以及各位stage3D同好。那么,希望通过阅读今天的文章,能够消除迷雾,帮助你清楚区分这二者以便更好运用。
首先,从硬件级别上来看。几乎每台计算机都有专门的硬件来绘图,其通常被称为显卡
[video ard, graphics card, or GPU]。我就直接称之为GPU。每台计算机还拥有一个主处理器用作通用计算(包括AS3),被称为CPU。在Stage3D无法调用计算机GPU的情况下,CPU会承担起双重任务,在计算的同时也处理图形的绘制。
CPU和GPU都有自己的暂存池:RAM。RAM的暂存池也许根本都是共用的,但这属于硬件细节了,Stage3D应用程序不可能涉及到。RAM的两种逻辑池中,为CPU所用的被称为“系统RAM”[system
RAM](或就是“RAM”);为GPU所用的称为“VRAM”。v是video的缩写。二者相比之下,VRAM要比RAM简单的多,其只支持4个类型的数据:
着色程序[Shader
Programs]:在显卡上运行的小程序,用于计算顶点位置和像素的颜色。你手上的这类数据应该不会太多,它们本身非常小(byte~KB)
顶点缓存[Vertex
Buffers]:浮点数数组,顶点着色器读取时使用的数据类型。它的数据大小视你的3D场景复杂度而定,中等大小(KB~MB)
索引缓存[Index
Buffers]:无符号整数数组,用于指定顶点缓存如何连结以形成三角形,而这些三角形式构成3D场景。它的数据大小同样视你的3D场景复杂度而定,通常很小(KB)
材质[Textures]:位图图像数据,片段着色器读取时使用的数据类型。通常很大(MB)
VRAM很简单,其通常相当小。一个VRAM仅有50MB(足以支持iPad
1)并不稀奇,但一个高端PC游戏却可能有1GB或更大。
但是,RAM通常比VRAM来的大些。现阶段,即便是低端智能手机也有512
MB,高端的至少有1-2 GB。台式和笔记本多年前就至少1 GB了,现在一般都是8~32
GB。这很正常,因为RAM承担其他所有任务:包括AS3代码和对象。
RAM唯一无能为力的,是GPU渲染3D场景时作为其内存池使用。为此,你必须从RAM“上载”(即复制)数据到VRAM。这意味着,你的图形数据暂时会同时出现在两个地方:RAM和VRAM。而一旦上载完成,你可以丢弃RAM中的副本。
由于可能存在压缩,纹理成了其中最复杂的数据类型。若你不用压缩,数据的两头将是大块的ARGB像素;而压缩之后,就为图像引入ATF。
概括下这篇介绍性文章,ATF是一种格式,可包含纹理多个备份,每个备份用不同的算法压缩,不同算法适用于特定GPU。这意味着,只要一份ATF就可以在不同类型的GPU上运作良好,呃,在这篇讨论何为RAM何为VRAM的文章中这貌似是题外话。
在你告诉Flash将ATF上载至VRAM的时候,它会匹配至那份用合适的算法压缩的纹理副本,并且只上载这份副本。假使在RAM中有一份ATF格式化的包含DXT1,
ETC1与PVRTC类型的纹理的ByteArray,若要上载到iPad 2,GPU只会发送PVRTC纹理。
另外要记住的一点也很重要,这些压缩纹理不会在接收完毕的时候被GPU解压。事实上,它也从不被完全解压。GPU动态渲染3D场景,选择性解压那些片段着色器需要的部分。这样一来,纹理依旧保持压缩状态,而且VRAM的占用情况也会保持很低。
最后要注意的一点是关于垃圾回收。AS3里你不需要为不再需要的内容显式释放内存。你所要做的只是确保不再保有这个对象的引用,Flash会自己释放该对象的内存占用。但是,GPU的情况并非如此。你必须为GPU资源:着色器程序,顶点缓存,索引缓存以及纹理,做创建[create]和释放[dispose]操作。Stage3D
API的实现很简单,但你还是要记得完成。如果你一味创建新资源而不释放旧资源,VRAM占用会越来越大,然后你就悲催了。操作系统可能会立即终止你的应用程序(如iOS)或只是所有操作开始拖慢(如Windows)。
原文链接:RAM与VRAM的解释
2013年06月06日 02点06分 1
1