移动端纹理压缩格式

纹理压缩可解决设备资源限制与表现追求的矛盾,DXT、ETC等纹理压缩方式能让GPU直接采样,减少内存和带宽占用。不同移动GPU平台需选择支持的压缩纹理,否则会浪费资源。IOS9开始支持ASTC压缩格式,压缩比增加且显示效果好,还给出了使用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址 https://www.cnblogs.com/zsb517/p/6297739.html

设备资源的限制和制作过程中对表现的无限追求永远是矛盾点,不会随设备的发展而转移。纹理压缩就是这种矛盾的一种解决方式,不同于 png、jgp 这种硬盘压缩方式而言,DXT,ETC 等纹理压缩方式可以在游戏运行中无需 CPU 解压就被 GPU 直接采样,可以极大的减少内存和带宽的占用,提升运行效率,对移动游戏而言更是如此。

这篇文章做一些简要概述,详细纹理压缩算法需要查阅更详细文档。

非压缩格式
格式内存消耗 (bytes/pixel)描述
RGBA8888(RGBA32)4bppRGBA 通道各占用 8 位
RGBA4444(RGBA16)2bpp每个像素 2 字节
RGB888(RGB24)3bpp每个像素 3 字节,RGB 通道各占用 8 位,无透明通道
RGB565(RGB16)2bpp每个像素 2 字节,RGB 通道各占用 5/6/5 位,无透明通道
压缩格式
格式压缩比GPU 支持描述图片要求
DXTDXT1:0.3/DXT5:0.6Windows\Android(Nvidia Tegra and Intel Bay Trail)分为 DXT1-DXT5 这五个级别,DXT1 适用于不具有透明度或者仅具有一位 Alpha 的贴图,DXT3 和 DX5 支持包含 4 位 alpha 通道的 RGB 纹理
ATC RGBA/RGBRGBA:0.25/RGB:0.125Qualcomm -Adreno高通 GPU 支持格式,支持带有 Alpha 的 RGB 纹理压缩。
PVRTC RGBA/RGB2bit:0.125/4bit:0.25PowerVRIOS 平台都支持, 支持每个像素 2 位或者 4 位的纹理,包含或者不包含 alpha 通道都可以;PVRTC 2-bpp 把一个 8×4 的像素单元组压成一个 64 位的数据块,压缩效果比较差;PVRTC 4-bpp 把一个 4×4 的像素单元组压成一个 64 位的数据块。游戏中使用 4 位压缩更多。尺寸为 2 的 N 次幂,并且宽高相同。
ETC1 RGB 4Bit0.125支持 Opnegl ES2.0 的 GPUOpenGL ES2.0 版本支持,移动 GPU 均支持的一个格式,遗憾的是不支持 Alpha 通道。ETC1 把一个 4x4 的像素单元组压成一个 64 位的数据块。游戏开发中采用最多的格式,不过麻烦的是需要对 Alpha 通道进行单独存储,Unity5.4.3 版本之后提供了官方支持尺寸为 2 的 N 次幂,长宽可不同
ETC2 ARGB/RGB 4bitRGBA:0.25/RGB:0.125支持 Opnegl ES3.0 的 GPUOpenGL ES 3.0 以上才支持,补全了 ETC1 不支持 Alpha 通道, 支持更高质量的压缩。虽然如此,从 Android 官方数据来看,还有相当大的设备是采用 Opengl ES2.0;使用需要谨慎,不过随着设备更新换代,开发时间周期比较长的游戏可以考虑直接使用尺寸为 4 的倍数

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

ASTC

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

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

ARM 的参考资料: ASTC: The Future of Texture Compression

引用

[1]: “常用纹理和纹理压缩格式” http://blog.csdn.net/ynnmnm/article/details/44983545
[2]:“Unity Compressed” https://docs.unity3d.com/Manual/class-TextureImporterOverride.html
[3]: “移动设备的纹理压缩方案” http://gad.qq.com/article/detail/72
[4]: “关于 U3D 贴图格式压缩” http://blog.sina.com.cn/s/blog_5b6cb9500102vi6i.html
[5]: “各种移动 GPU 压缩纹理的使用方法” http://www.cnblogs.com/luming1979/archive/2013/02/04/2891421.html
[6] “版本分布情况” https://developer.android.com/about/dashboards/index.html#Screens

### Cocos Creator 开发微信小游戏支持的纹理压缩格式 在开发基于 Cocos Creator 的微信小游戏时,为了优化性能并减小包体积,合理选择和应用纹理压缩技术至关重要。对于微信小游戏平台,在 Cocos Creator 中可以采用多种方式来处理图像资源以实现有效的压缩。 #### PVRTC 和 ETC 压缩格式的支持情况 尽管某些移动设备可能原生支持特定类型的硬件加速压缩格式如PVRTC (PowerVR Texture Compression) 或者 ETC (Ericsson Texture Compression),然而这些格式并不一定能在所有的目标平台上得到良好兼容,尤其是考虑到微信小游戏运行环境多样性的问题[^3]。 #### 使用自定义脚本进行预处理 由于直接利用上述提到的传统压缩方案存在局限性,更推荐的做法是在项目构建阶段通过编写自定义脚本来批量转换素材为适合的目标格式。例如,可考虑将原始图片先转码成 PNG 格式再进一步实施软件层面的无损或有损压缩算法,从而既保持较好的画质又能够显著降低最终发布的包体大小[^4]。 #### WebP 图像格式的应用 值得注意的是,WebP 是一种非常适合用于网络传输以及嵌入式系统的现代图像编码标准,它提供了优于 JPEG 及 PNG 的压缩效率,并且已经被广泛应用于各类浏览器及移动端应用程序之中。因此,在条件允许的情况下优先选用 WebP 来作为内部使用的纹理格式是一个不错的选择[^2]。 ```javascript // 脚本示例:自动检测并尝试加载不同质量级别的 WebP 版本纹理 cc.loader.onProgress = function(url, progress){ console.log('Loading asset:', url); }; let imgPath = 'res/images/'; if(cc.sys.isBrowser && cc.sys.BROWSER_TYPE_WECHAT_GAME){ let webpUrl = `${imgPath}${filename}.webp`; tryLoadTexture(webpUrl).catch(() => { fallbackToDefaultFormat(imgPath + filename); // 如果失败则回退到其他格式 }); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值