Adobe Texture Format

时间:2023-02-12 19:39:20

ATF : Adobe Texture Format. 这是一种能提供最佳压缩效果的文件格式。 ATF文件主要是一个存储有损纹理数据(lossy texture data)的文件容器。它主要使用了两种类似技术:JPEG-XR1压缩技术和基于块的压缩技术(简称块压缩技术),来实现它的有损压缩。

为 GPU 优化贴图,支持压缩贴图格式 ATF (Adobe Texture Format),减少在使用中显存的总量。这点对于移动设备是特别重要的。

ATF格式全称 Adobe Texture Format
说白了,就是奥多比 专用贴图格式。 这里大家注意到没有 Texture 这个词是在GPU加速的字典里才出现的。
普通的图只能叫 BitmapData 而到了GPU里才能叫Texture。
证明这个ATF格式是和FLASH11 支持GPU硬件加速紧密相连的。
那么ATF能实现哪些功能,让GPU进行加速?
ATF支持2种格式,其中支持一种DXT1的格式。
问谷哥,这种格式由显卡公司S3开发,能够大幅节省显存。而目前流行的格式有 DXT1,DXT3,DXT5等。
而现在ATF只支持DXT1。
这里得给大家做个科普,一张图片在内存里的大小,
是根据公式 SIZE = WIDTH * HEIGHT * BPP(比特每像素一个像素所能表达的不同颜色数取决于比特每像素(BPP),若bpp=4,则为2^4色) 决定的。
加入一张1024 X 1024的真彩色图片,那么在内存里就 占用了 4MB 空间 。
假如使用 DXT1格式,那么将大幅度减少占用量减少到原来的30%。大幅节省空间。
由于解压缩算法是GPU硬件完成,所以能够同时获得空间压缩以及GPU加速的效果。
这也就是为什么这种格式如此流行的原因了。
此外还有朋友问,JPEG和PNG也是压缩格式也能获得压缩他们和ATF有什么区别呢
JPEG和PNG在外部的确是压缩保存的,当他们被加载,FLASH会做2件事情
1 从外部读取2进制文件
2 DECODE,从压缩的2进制还原到BITMAPDATA
大家注意到没有,这里就存在巨大的性能损失了,因为DECODE是由CPU完成的,在游戏运行时
做这件事情比较频繁的话,就很容易引起卡顿。
而这是众多大型MMO游戏卡的根本原因。
而用了ATF格式,由于解压缩算法由GPU完成,所以FLASH只要做一件事情,就是加载上传
就搞定了,具体调用的API接口是 Texture3D.uploadCompressTexture.
直接加载,上传搞定。不存在CPU开销巨大的DECODE,从根本上保证了游戏流畅度。
当然ATF格式作为一个新生儿,还是有很大的成长空间
1,ATF需要在未来支持更多的 DXT格式,最好1-5都能支持。当然这取决于目标硬件的普及程度。
2,ATF需要优化算法和存储结构,减少本身的体积占用,目前ATF格式要比PNG格式大20%。
3,需要整合进ADOBE各种产品线,比如PHOTOSHOP能够直接保存出ATF格式。
4,外围拓展,将ATF整合进3DMAX,MAYA等3D工具。以及整合进各种3D引擎。

关于Texture:

Mip 映射是一个重要却简单易懂的概念。将一个纹理保存多个缩小版本的方式就叫做 Mip 映射(例如:近处要使用512*512的纹理,那么远处则使用较小的就可以了)【PS:如一个 256*256 尺寸的纹理被保存了 128*128、64*64….1*1 这么多版本的纹理于内存中】。

需要注意的是,若要使用Mip映射,那么你的纹理尺寸必须保证为2的倍数(1, 2, 4, 8, 16, 32, 64, 128, 256,512, 1024, 2048), 但形状不一定必须是矩形。如果你没有遵守这个规则,那么Starling将会为你自动创建一个与当前纹理尺寸最接近的能被2整除的数值作为尺寸的纹理(如你使用的纹理尺寸为31*31,那么Starling会为你创建一个32*32尺寸的纹理),但这可能会对内存有一点消耗。为了确保尽可能地优化纹理的内存占用,我们建议您最好使texture atlases(翻译成中文叫做纹理贴图集,但是没多少人会用中文称呼之),也被广泛称作SpriteSheet(翻译成中文叫做精灵表,但是也没人这么叫它,都直接用英文名称呼的)的素材集成、使用方式。稍后我们会接着讨论它。

为了保证最佳的呈现品质,GPU 需要一个图片的全部 Mip 映射等级,即由原始尺寸依次除
以二直到除不尽 2 了为止。 【PS:对于一个 128*128 尺寸的纹理来说,它的全部 Mip映射等级为:64*64,32*32,16*16,8*8,4*4,2*2以及 1*1】Starling框架能够自动替你生成全部 Mip 映射等级,若是你不用 Starling框架的话,那你就得通过使用 BitmapData.draw 这个 API 并使用一个缩小一倍的 Matrix 作为参数来手动地生成全部的映射等级。

建议为2D内容使用Mip映射,这样可以使它们在缩放时能够减少锯齿的产生。