前言
为什么移动端需要压缩图片
移动处理器带宽非常低. 因此移动处理中的图片压缩就非常重要. 特别是对于低端手机, 其带宽 尤其缺乏.
移动端带宽缺乏原因有二:
- 显存与内存共享带宽, 不但GPU要访问, CPU也要访问.
- 由于需要控制发热的原因, 导致手机使用的是LPDDR4内存, 位宽只有32bit.
主流资源格式方案选择
方案选项 | 条件 | 优缺点 | IOS市场占用率 | Android市场占用率 |
---|---|---|---|---|
方案1推荐
|
新立项游戏,或高品质游戏 | 制作流程相对简单, 再高档机器上没有损失 | 93.7%(2019年) | 80% |
方案2 | 老旧游戏维护, 低端游戏,或是需要考虑到东南亚低端机型 | 支持所有机型但, 制作流程相对复杂,额外增加开发成本, 需要修改Shader使其支持Alpha分离 | 100% | 100% |
方案1 使用ASTC与ETC2配合
格式 | 平台 | 透明 |
---|---|---|
ASTC 4x4 | IOS | 是 |
ASTC 6x6 | IOS | 否 |
ETC2 8bit | ANDROID | 是 |
ETC2 4bit | ANDROID | 否 |
说明: 在透明图片上需要更高的精度格式才能达到 期望效果
方案2 使用ETC1与PVRTC
格式 | 平台 | 透明 |
---|---|---|
PVRTC 4bit+ Alpha分离 | IOS | 是 |
PVRTC 4bit | IOS | 否 |
ETC 4bit + Alpha分离 | ANDROID | 是 |
ETC 4bit | ANDROID | 否 |
说明: 4bit 已是 ETC与PVRTC 最高的要求, PVRTC虽然支持透明通道, 但是效果太差, 再考虑两个平台一套代码逻辑更容易维护 所以对与透明通道都使用了alpha分离方案
使用细节
图片压缩类型
- GPU支持格式, 依赖设备硬件解压, GPU可以直接使用. 比如 ETC, PVRTC, ASTC 等
<font color=#7FFFD4 size=5>所有Unity支持的图片, 比如PNG,JPG,PSD 实际上Unity 自动解压再做二次压缩. 打包到目标设备一般是GPU支持的格式</font>
- GPU不支持格式, 依赖CPU解压后 再提交给GPU. 比如PNG, WEBP, JPG
真的要使用WEBP等格式, 需要由CPU解压. 目前需要将图片改成非图片格式绕过Unity 的图片打包流程, 扩
展名改为txt或bytes当成二进制数据, 再使用第三方插件, 将其加载到内存中再解压.
图片压缩格式的选择
图片格式 | Android | IOS | 透明 | 限制条件 |
---|---|---|---|---|
ETC | 所有 | 否 | 否 | 长宽为2的幂次 |
PVRTC | 否 | 所有 | 质量差 | 长宽为2的幂次并相等 |
ETC2 | 2014年 | 不使用 | ETC2 8bit | 长宽为4的倍数 |
ASTC | 不通用 | IPHONE6 以及后续机型 | 支持 | 无限制 |
当压缩不足以满足画质要求, 有两种做法.
- 第一是拉伸图片大小后再压缩
- 使用原生图片的方式, 下面是几种常用格式选择
其他图片格式的选择
当我们压缩图片的画质无法满足效果时,会考虑使用类似原图的资源格式
一般移动图片压缩格式加载流程: IO加载=>发送至显卡
WEBP图片加载流程: IO加载=>CPU解压成RGBA格式=>发送至显卡
图片格式 | 透明 | 是否压缩 | 额外内存消耗 | GPU带宽消耗 |
---|---|---|---|---|
RGBA16 | 是 | 是 | 无 | 一般 |
RGBA32 | 是 | 否 | 无 | 高 |
WEBP慎用
|
是 | 是 | 有 | 高 |
网友评论