Unity 图片资源格式的设置

前言

为什么移动端需要压缩图片

移动处理器带宽非常低. 因此移动处理中的图片压缩就非常重要. 特别是对于低端手机, 其带宽 尤其缺乏.

移动端带宽缺乏原因有二:

  1. 显存与内存共享带宽, 不但GPU要访问, CPU也要访问.
  2. 由于需要控制发热的原因, 导致手机使用的是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 等

所有Unity支持的图片, 比如PNG,JPG,PSD 实际上Unity 自动解压再做二次压缩. 打包到目标设备一般是GPU支持的格式

  • 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慎用

参考资料

  • https://zhuanlan.zhihu.com/p/113366420
  • https://zhuanlan.zhihu.com/p/158740249
  • https://answer.uwa4d.com/question/5a6700517daacf4c7ff04918
  • https://answer.uwa4d.com/question/5c7695f363826a332ad9970b
  • http://www.ringmagic.cn/danshou/47.html
  • 内存带宽对比

你可能感兴趣的:(Unity 图片资源格式的设置)