摆脱臃肿--Unity3D安卓包减肥秘笈 (一)
减包瘦身是一项需要精细操作的工作。本文整理了0907版本的操作过程,以供日后参考。
在各位开发人员、美术设计师和策划人员的共同努力下,UI资源(包括图集、字体、单局外模型贴图)从45.4MB减少到了24.5MB,具体数据如下表所示(此处原文未给出表格,可根据实际情况补充)。
在实际操作中,针对同一个资源,可以组合应用多个压缩选项。文中所指的【图集Atlas】是多个小图片的合集,【Texture】是单张图片,大小均指打包前的资源大小。下面将详细介绍各种减包方法:
1. 删除无效的、废弃的资源
无效和废弃的资源应当从项目工程中移除。可以从以下几个方面来确认资源是否为废弃资源:
- Texture:
- 在prefab中搜索texture.png.meta文件的guid,确认是否被引用。
- 在C#代码中搜索文件名,确认是否被动态指定。
- 图集Atlas:在prefab中搜索atlas.prefab.meta文件的guid,确认是否被引用。
- 图集Atlas的单个图片:
- 在prefab中搜索图片文件名,确认是否被直接引用。
- 在C#代码中搜索图片完整或局部文件名,确认是否被动态指定。
2. 取消图集Atlas的正方形限制
工程项目中提供的图集制作工具(HDAtlasMaker)默认生成正方形图集Atlas,这种方式存在较大的资源浪费。因为当限制图集为正方形时,很多情况下图集的大部分区域是空白的。实际上,应该取消正方形限制。
- 例子(无损):宽 高从2048 2048(16M)缩减为1024 * 2048(8M)。
- 适用场合:去掉正方形限制后,可使图集缩小一个尺寸。
3. 使用TexturePackerGUI打包,勾选Trim属性去除透明边界
使用TexturePackerGUI工具制作图集时,可以预览图集效果。勾选Trim属性的本质是,在图集打包时用Padding属性代替透明边界。
- 例子(无损):宽 高从512 1024(2M)缩减为512 * 512(1M)。
- 适用场合:去掉透明边界后,可使图集缩小一个尺寸。
4. 调整Texture初始默认导入设置
Texture的默认导入设置包含Mip Maps,Mip Maps是为了让物体在视野远近不同时生成不同分辨率的纹理。但UI贴图不需要考虑远近因素,因此无需生成小纹理。所以,应将Texture导入设置改为Advanced,并取消Generate Mip Maps。
- 无损示例:从1.3M缩减为1.0M。
- 适用场合:默认导入设置为Texture的全部UI图片资源。
5. 调整Texture导入设置(Advanced:无Alpha透明通道)
(1)无损压缩
- 示例:从RGBA 32 Bits(2.3MB)转换为RGB 24 Bits(1.7MB)。
- 适用场合:适用于无Alpha透明通道的单个图片,如登陆背景、通用背景等。
(2)有损压缩
- 示例:从RGB 24 Bits(1.7MB)转换为RGB ETC 4Bits(256KB)。需要注意的是,ETC需设置资源宽高为2幂次方,当实际尺寸非2幂次方时,将进行伸缩处理。
- 适用场合:适用于无Alpha透明通道,且画质要求较低的单个图片,如结算背景、领奖背景、通用背景、Loading图、3D模型贴图等。
(3)进一步有损压缩
- 示例:在(2)的基础上,将RGB ETC 4Bits & Max 1024(256KB)调整为RGB ETC 4Bits & Max 512(64KB)。当实际尺寸超过512时将拉伸到实际尺寸,会进一步模糊画质。此处的512也可根据实际情况选用256、128、64、32等。
- 适用场合:与(2)相同,适用于无Alpha透明通道,且画质要求更低的单个图片。
6. 调整Texture导入设置(Advanced:有Alpha透明通道)
(1)有损压缩
- 示例:从RGBA 32 Bits(1.1MB)转换为RGBA 16 Bits(0.5MB)。
- 适用场合:适用于有Alpha透明通道,且画质要求较低的单个图片。
(2)进一步有损压缩
- 示例:在(1)的基础上,将RGBA 16 Bits & Max 1024(0.5MB)调整为RGBA 16 Bits & Max 512(360KB),画质会在(1)的基础上进一步模糊。
- 适用场合:与(1)相同,适用于有Alpha透明通道,且画质要求更低的单个图片。
7. Texture从Atlas分离出来
- 例子(几乎无损):宽高从512 512(1M)变为256 512(0.5M)+ RGBA 16Bits(50KB)。
- 适用场合:分离出尺寸最大的单个图片后,剩下小图片生成的图集Atlas能缩小一个尺寸。
8. 去掉边缘发光
- 例子(几乎无损):宽高从640 326(0.8M)变为234 126(115KB)。
- 适用场合:适用于边缘发光去掉后对画质不影响或影响甚微的单个图片。
9. 去掉边缘装饰
- 例子(几乎无损):宽高从585 141(322KB)变为510 79(157KB)。
- 适用场合:适用于边缘装饰去掉后对画质不影响或影响甚微的单个图片。
10. 整合图集Atlas
- 例子(几乎无损):将两个256 512(0.5M 2)整合为一个256 * 512(0.5M)+若干独立小图。
- 适用场合:适用于图集小图片有交集,所属模块类似,且都有剩余空间,整合后刚好合适的情况。
11. 重新裁切透明边框尺寸(Atlas)
- 例子(几乎无损):从512 512(0.5M)变为512 256(256KB)。
- 适用场合:适用于NGUI Font。由于UI Font不能直接Trim,需处理原始资源,切掉透明边框。
12. 重新裁切透明边框尺寸(Texture)
- 例子(无损):从640 499(0.6M)变为640 450(0.5M)。
- 适用场景:适用于有透明边框的Texture。由于Texture不能直接Trim,需处理原始资源,切掉透明边框。
13. 缩小资源原始尺寸(Atlas)
- 例子(有损):宽 高从1024 2048(8M)变为1024 * 1024(4M)。
- 适用场景:适用于图集Atlas空白太多,且图集元素能接受小范围画质模糊的情况。操作时,将小图片缩小80%,重新制作图集,实际应用UISprite时再通过代码恢复125%回到原始尺寸。
14. 缩小资源原始尺寸(Texture)
- 例子(有损):以登陆界面背景为例,原始尺寸640 1136。若直接导入原尺寸,资源较大(2.1M);若按Max 1024导入也不小(1.7M);若按Max 512导入则只需432KB,但此图为重要门面背景,画质不能接受。又因为导入设置不支持512 - 1024的中间尺寸,所以需要手动缩小原始尺寸到合适尺寸和画质,比如此处中间版本【原图66.6% = 480 852(1.2M)】。
- 适用场景:适用于类似需要在画质和资源大小之间进行平衡的Texture。
15. 调整策划需求
- 例子(无损):从640 630(1.2M)变为32 32(3KB)。
- 适用场景:适用于特定需求和特定应用场景。例如项目中特定时间区间内显示运营Loading图,其他时间显示默认Loading图。可以让运营策划调整该特定时间区间,使之包含整个测试期间,这样默认Loading图就无需显示,其导入尺寸可缩小到最小。此处不直接删除默认Loading图是为了避免逻辑出错,且方便日后恢复。
16. 统一背景资源
背景大图等资源应尽量复用。例如,曾经出现过的几个背景图差异微小,经商讨后,最终统一用第三个,删除另外两个。
17. 缩减关键图集Atlas尺寸
例如,将Common图集Atlas中的ABCS品质独立出来,剩下的部分打包成更小尺寸的Atlas。关键图集出现概率很高,缩减操作是为了节省内存。
18. 分析构建日志
分析C:\Users\[你的用户名]\AppData\Local\Unity\Editor\Editor.log当中的构建日志部分,查看打包资源列表,可能会有以下发现:
- NGUI样例图集被打包进去:搜索发现并无被直接引用,而是间接引用。为防止出错不直接删除,而是将Max Size调整到很小。
- 发现重复图集:需要对重复图集进行处理。
- 图集导入设置有误:例如宠物图集占用5.3MB,而不是4.0MB,经检查发现导入设置有误,生成了Mip Maps。类似的大图集有好几个,需要逐一检查处理。
- 重点优化大图集:如新手引导和头像集合这两个图集很大,需要进一步重点优化。