导航:首页 > 文件处理 > 游戏首次纹理压缩

游戏首次纹理压缩

发布时间:2024-09-29 16:31:39

A. 纹理压缩简介 DXT PVR ETC

参考
为什么需要纹理压缩
移动端纹理压缩格式
干货:Unity游戏开发图片纹理压缩方案
Creator使用压缩纹理
常用纹理和纹理压缩格式
移动设备的纹理压缩方案
各种移动GPU压缩纹理的使用方法

在软件开发,特别是三维应用中,纹理随处可见,但受限于网络环境和硬件能力,纹理也是一大瓶颈。而且在一般的三维应用中,纹理所占大小基本都会在1/2以上,模型中往往超过2/3。或许你会说,纹理不就是一张图吗,有那么重要吗?如下两张对比图,可能你会认为前者逼格高,但对于正常人而言,后者显然要好很多。正是有了纹理,如同在骨架上赋予了皮肤,让我们的应用更加的逼真,贴近现实。

而你能想象到吗?如上的模型一共有三张纹理,其中之一效果如下:

纹理的拼接是纹理压缩的开始,采用不同的压缩方式对纹理最终的大小影响也是显着的。比如上面的这张纹理在不同压缩格式下的大小差别也是非常显着的(原始文件为tga格式,通过Photoshop转换为其他格式,默认选项):

不同于png、jgp这种硬盘压缩方式而言,DXT,ETC等纹理压缩方式可以在游戏运行中无需CPU解压就被GPU直接采样,可以极大的减少内存和带宽的占用,提升运行效率,对移动游戏而言更是如此。

1.DXT

DXT是一种有损纹理压缩算法,微软的Direct中支持,DXT的格式包括DXT1~DXT5,其中DXT1和DXT5较为多见,后面会做详细讨论。可以说DXT是目前应用最广泛的纹理压缩格式,可以认为所有的PC端显卡都支持DXT压缩,维基网络记录,该专利有效期到2017年10月2号。

DXT算法非常容易理解,而且整体看上去效果不错,但如果对局部特写,会发现在细节上会有很多丢失,这也是算法本身导致的,毕竟每个块只有两个颜色,而其他颜色都是在这两个颜色区间的差值,如果当前区域内还有其他显着颜色则必然会有丢失。

另外一个问题就是DXT3和DXT5之间的对比,相比DXT1不支持透明度(但支持是否透明),DXT5要大一倍(多了64bit),和之前颜色保存方案一样对透明度也保存了两个16位的颜色和对应的调色板,对RGBA的效果也得到了保证,但DXT3思路不一样,它是对每一个像素保存了4bit的透明度,同样也是多了64bit,但此时毕竟只有16个透明度选项,相比DXT5,在压缩率上相当,但对透明色的处理不够细腻,因此在实用性上并不推荐DXT3。

尽管DXT在细节上有明显硬伤,在总体效果不错,而且确实是一种强大的压缩方式,所以在多数纹理压缩选择中都是最佳方案,几乎可以认为是PC下的标准压缩格式。

2.PVR&ETC
也许是出于专利和商业角度,也许确实DXT在移动端确实无法满足要求,DXT并没有在移动端得到很大的支持,相反,在iOS设备中支持的是PVR压缩,在Android中支持的是ETC压缩。

DXT在细节上缺陷明显,最重要的原因是当把纹理分为4*4像素的区域块后,每个块之间都是独立的,尽管这极大的简化了压缩算法,但却丢失了相邻块之间这种普遍的相似性。这是算法本身导致的,而PVR则会考虑该区域块对应的右侧,下侧和右下侧的三个区域块的关联性。

从现实的角度来看,受制于专利和硬件厂商,我们并没太多选择的余地,Android下就要用ETC,iOS下只能PVR,而在PC上不用DXT估计就要被嘲讽了。但这也是一个很棘手的问题,比如在WebGL下,特别是Android下差异化很大,是否支持纹理压缩,甚至在同一个设备不同的浏览器,因为驱动的不一致,可能系统自带的会支持ETC压缩,而微信等QQ浏览器下并不支持。而且华为的手机貌似在浏览器级别下都不支持ETC(硬件支持,还是驱动的问题)。而如果在移动设备上不用压缩,显存是有限的,除非你在数据量上做出牺牲,怎么解决都很矛盾,相比而言,iOS下则要舒服很多。

Unity官网对每个平台默认的纹理压缩格式以及使用建议给出了 详细描述 ,需要注意的是:在不同移动GPU平台下选择GPU支持的压缩纹理,就可以在不需要CPU解压的情况下直接被GPU采样,节省CPU内存和带宽,也可以节省存储的体积。 如果目标平台不支持设置的压缩格式,纹理将解压为RGBA32或者RGB24,浪费CPU时间和内存

参考 几种主流贴图压缩算法的实现原理
从IOS9(A8架构)Apple 手机开始支持ASTC压缩格式 ,如果考虑放弃Apple 6代之前的手机兼容问题了,可以直接使用了。相对于PVRTC2/4而言,ASTC(4X4)的压缩比会增加到0.25,不过显示效果也会好很多,而且不需要把图片设置为方形。

Using ASTC Texture Compression for Game Assets 说明的比较详细,也给出了一些使用上的建议,即针对不同贴图类型给出不同的压缩方案。

1. laya问答 H5游戏能使用压缩纹理(ETC,PVR等)吗?
Q:H5游戏能使用压缩纹理(ETC,PVR等)吗?
A:部分浏览器会不支持(比如safari)
Q:那laya里面能根据不同浏览器(或不同平台)使用不同压缩格式的纹理吗?
A:你自己是可以获取到当前是哪个浏览器的,自行处理即可

2. LAYA Runtme目前支持 ETC/DXT或者PVR这类格式吗?在文档中没有找到这类的说明
LayaAir目前暂时还不支持ETC/DXT/PVR这类格式!关注layaAir的版本引擎更新日志即可,支持了我们会及时告知!

3. Egret 内存分析-RES加载资源后存在双份内存无法释放的问题
支持pvr、etc已经在计划中。

B. 一个操作让游戏内存立减50+%-CocosCreator性能优化之压缩纹理

在游戏中,纹理不仅占据大量的包体,也占据了大量的内存。传统的图片压缩格式(如JPEG、PNG等)虽能减少资源大小,但是不能被GPU直接识别,还是需要先加载到内存通过CPU解码,转换成RGB/RGBA等能被GPU识别的格式,才能传送到GPU进行渲染。

为避免这些问题,压缩纹理,指的是一种针对GPU的纹理压缩方案,使纹理能够直接被GPU识别并进行渲染,它具有以下优点。

传统的图片压缩主要目的是 存储 和 传输 ,为了尽可能的高效压缩,使用了可变的压缩比率,因此在解压时需要解压更多的像素位才能读取某个像素的位置,不适合随机和快速读取,也发挥不了GPU的并行处理优势。

而压缩纹理使用一个固定的压缩比率,将纹理划分成多个像素块,每个像素块包含 2*2 或 4*4 个像素,然后对每个像素块进行压缩,被压缩的像素信息存储在一个像素集合中,每个像素块的索引位置存储在一个块索引图中。读取时,首先将纹理坐标转化为块索引值,然后在像素集合中查找对应的像素块,最后在这个像素块中找到纹理颜色值。

因为采用了固定的压缩比率,GPU内部可以并行处理,从而快速的解压缩。与之相对的是,纹理的压缩过程发生在程序运行之前,并不在意编码速度,因此在压缩时会遍历所有可能性,找到和原始像素差值最小的编码,这也是纹理压缩耗时较久的原因。

顺便说一下,普通图片格式中,PNG是无损压缩,JPEG是有损压缩。而压缩纹理都是有损压缩,只是在绝大部分情况下,手机上看不出来而已。

手机上使用压缩纹理依赖于OpenGL ES的支持,OpenGL ES 2.0本身并没有定义任何纹理压缩格式,它仅提供 glCompressTexImage2D() 方法供应用程序上传压缩纹理,压缩纹理的格式由各个GPU厂商定义和实现。

OpenGL ES 3.0提供了压缩纹理标准,使各个平台都可以使用同一种压缩纹理,但市面上的设备还需要很长时间才会全部过渡到OpenGL ES 3.0。因此,仍然需要对不同的平台和设备使用不同的压缩纹理格式。

手机游戏中常用的有以下格式。

ETC1把 4*4 的像素块压缩成固定的64位编码(8个字节), 4*4 像素块是16个像素,每个像素4字节,一共占64个字节,所以压缩比是 64/8=8。但是ETC1只能存储RGB信息,不适用带透明度的纹理,为解决这个问题,Creator在ETC1文件中额外写入了透明度信息,即ETC1+A格式,它的压缩比是 64/16=4。
ETC1/ETC1+A需要OpenGL ES 2.0(对应WebGL 1.0)环境,目前几乎所有Android手机都支持ETC1,但是iOS不支持。
ETC1/ETC1+A纹理的长宽可以不相等,但要求是2的幂次方。

ETC2是ETC1的扩展,压缩比率一样,但压缩质量更高,而且支持透明通道,能完整存储RGBA信息。
ETC2需要OpenGL ES 3.0(对应WebGL 2.0)环境,目前还有不少低端Android手机不兼容,iOS方面从 iPhone5S 开始都支持OpenGL ES 3.0。
ETC2和ETC1一样,长宽可以不相等,但要求是2的幂次方。

Creator中常用的是PVRTC4+A,压缩比和ETC一样,iOS全系列支持,但是Android不支持。另外PVR要求纹理长宽相等(正方形)且是2的幂次方,例如 1280*720 的PNG图片,转换后变成 2048*2048 ,这一点会大大增加内存消耗。在实测中还发现转换后的图片质量不如ETC1,存在模糊、毛边现象,对画面要求高的游戏不适合。

压缩纹理的使用非常简单,根据构建平台添加需要的格式即可,具体参见Creator官方文档,本文不再重复了。

Creator编辑器还提供了转换压缩纹理的选项,根据转换速度分为Fast、Slow等好几档,速度越慢则画面质量越好。但不管选哪个,只影响显示效果和转换时长,显存占用都是一样的。一般情况下,显存占用就是压缩纹理的文件大小,例如文件大小是1.5M,则它占用的显存也是1.5M。

在设置压缩纹理格式时,目前Creator 2.x版本还需手动一个一个设置。如果想一次性设置所有或部分资源,自己写个脚本遍历修改对应的 .meta 文件也比较方便,这里是一个我写好的脚本 一键自动化设置压缩纹理格式

在实际项目中的测试结果是,单图、自动图集、TexturePack合图加起来超过两千张图片的Creator工程,使用PNG时打出来的apk包大小近500M,内存占用1.3G。采用压缩纹理后,包体大小降到150M,内存占用降到600M。

C. 玩游戏的时候线条会变成一段一段的 我用的是N卡 玩坦克世界的时候也是这样 车上的铁丝远了也会变成这张图

按ESC→设置→图像→第四行 “反锯齿处理” X2 X4或是X8,越高效果越好,也越耗费系统资源,一定要量力而行。

其他图像配置
建议全屏幕游戏 分辨率为屏幕分辨率,垂直同步 关
纹理质量 中 (调成低的话 坦克 建筑什么的真的很难看,看你自己的取舍了)
纹理压缩 开 (关闭纹理压缩 可以让你的 纹理质量达到极致,奢侈的东西)
纹理算法 X2 (使 “ 接近 与你视线平行的面”纹理的清晰度,奢侈的东西,)
阴影质量 关 (低就是 坦克阴影数量少 高就是多,反正调成低 也就只能显示自己的阴影 干脆关了)
阴影效果增强 关 ( 树 等 物体阴影 会体现在你的 坦克上 ,奢侈的东西 )
水的画质 中 (中即可)
模拟水纹 开 (模拟水面有些许波纹的反光效果)
树的画质 低 (没用 调低)
灌木丛密度 关 (地上 没有用的 杂草丛,除了 挡视野外没其他用处)
高级后期渲染 关 (会模拟 开镜后 的 焦距模糊,必关)
后期渲染 关 (光晕 效果, 没有必要的 )
视野距离 高(必须高 不然远处的敌人被点亮 也看不到轮廓)
log 高 (这个 是 模型 和 贴图 精细度衰减 这个要是低了 其他的都是高 也没用)
附加效果 低 (开炮 和 炮弹落地的 烟雾, 高了就像是被扔了烟雾弹,不过至少是低)
狙击模式效果 关 (必须关!不管你什么显卡都能卡死你!)
下面三项 除履带印记 全不选

其中有一些 像后期渲染 都可以看配置 适当调整。

阅读全文

与游戏首次纹理压缩相关的资料

热点内容
下载压缩密码 浏览:257
android系统上编程 浏览:468
单片机模拟i2c从机 浏览:236
教育年报系统服务器如何开启 浏览:840
对称密钥加密后的长度 浏览:292
微制造编程软件下载 浏览:106
旋住宿酒店用哪个App最好 浏览:60
三菱编程中怎么创建子程序 浏览:199
在单片机温度输入采集信号有 浏览:684
电脑云服务器同步 浏览:418
方舟生存进化手游版怎么转服务器 浏览:89
哪个app可以听小说 浏览:160
网络发送数据如何加密 浏览:201
教材完全解读pdf 浏览:820
什么是多台服务器 浏览:36
菜鸟音乐编辑app哪个好 浏览:547
人工鱼群算法matlab 浏览:82
算法coursera 浏览:124
潍坊诸城DNS服务器地址联通 浏览:10
共享文件夹不显示任务栏 浏览:253