Arzie100 发表于 2022-6-3 13:38

Unity包体优化

包体优化几乎是中大型项目回避不了的问题。
最近也从事了两个项目的包体优化,简单阐述下我的一点经验:
1、AssetStudio:

通过工具可以很好的定位冗余资源,没经过优化的bundle我是不相信不存在冗余资源的(哪怕是用的addressables)。一般存在以下几点:
①、多个bundle引用同一份资源,被各自打包。最常见的shader、material、Font。
②、被放在Resources目录下的资源引用、或者引用了Resources目录下的资源。
③、如果不是Addressable,需要警惕一下Sprite被当成Texture使用打成多份。
④、非addressables,请使用BuildPipline.BuildAssetBundles一起打包scene文件。

2、合理的数据:

①、贴图可以考虑全平台使用ASTC,当然根据自己的情况而定。不同的需求也可以再细分ASTC。切勿使用位图。
mipmap因情况而定(2D项目几乎没有需求),就算3D项目如果相机始终不动也没必要开mip。正交相机下UI应该始终关闭mip。
Read/Write也应该都是关闭的,除非特定需要。
根据不同功能合理限制贴图的尺寸上限。
能使用texture就不要使用sprite。
纹理往往占包体大头。所以应该时刻警惕纹理被滥用。
②、音效文件(非背景音乐和一些关键的声音外),可以考虑降低采样率或品质,关闭双通道。
③、视频文件建议通过三方的工具先转一次。个人建议小丸工具箱或者其他工具,保证清晰度和大小可接受。
如果对机型适配不高的项目,也可以考虑H265,至少Android平台问题还好。
④、动画文件,如果对精度要求不高,可以考虑优化掉小数点两位后的数据。
⑤、模型文件,你应该始终关闭Read/Write,就算需要也只是针对性的打开。尽可能压缩你的mesh,也可根据不同通道选择性压缩。

3、删除非必要:

①、字体,考虑剔除生僻字。
②、shader变体,使用不到的变体不要打到包里。
③、不建议在工程里加入Always Included shaders。
④、剔除掉unity builtin的资源,剔除方法:
⑤、删除使用不到的package以及插件,就算使用的插件也要删除里面的Demo或Samples,同样插件里一般还会附带资源,这些资源有的是Resources的,有的是全部加载,都需要根据自己的情况合理剔除和修改。
⑥、材质残留资源:

4、重复资源:

写个工具跑一下项目中md5相同的资源,然后重新规划这些资源。项目过大之后会存在非常多相同的贴图、模型、动画文件,甚至还有prefab。跑出来的结果只会让你惊讶。

5、废弃资源:

随着项目的迭代,这一部分资源量非常大,除非说项目一开始就有很好的规划,所有策划和美术也都理解这些规则,但往往是不太现实的。
同样写一个工具,把所有配置表、代码、以及被引用的资源都筛出来,剩下的就是废弃的资源。

6、其他:

①、il2cpp可以开master编译、api可以选Standard 2.0、Stripping Level可以自行调整。
②、il2cpp大量使用模板、Action、元组等,也可以优化,后面再写文章详细聊下这个环节。
③、lua最好编译成字节码。
④、lua配置表,可以参考我这个优化:
⑤、尽量减少对system的依赖,使用mono.xml代替system.xml。

以往经验告诉我,项目迭代两三年以上,包体起码可以优化30%-50%下来。

xiangtingsl 发表于 2022-6-3 13:39

不是很懂动画文件去掉小数点两位后怎么可以起到压缩文件的效果?

NoiseFloor 发表于 2022-6-3 13:42

写个脚本,将.anim文件读出来,然后将小数点数据做四舍五入(只保留小数点后两位或者三位)。如果部分动画文件出现抖动,那就加长小数点后数据长度。

zt3ff3n 发表于 2022-6-3 13:52

你四舍五入以后还是浮点数,好像省不了存储空间

Arzie100 发表于 2022-6-3 13:57

是的,你说的是内存,我说的是包体

acecase 发表于 2022-6-3 13:57

这么说,anim存储格式是string的?不是二进制的?不是跟你抬杠哈,我单纯好奇

闲鱼技术01 发表于 2022-6-3 14:04

你的问题很好,这个要看你项目中Asset Serialization的模式,如果是Force Text那么优化小数点对包体是有影响的。

xiaozongpeng 发表于 2022-6-3 14:08

主要还还可以增加animation.constant curve数量,引擎在底层有优化
页: [1]
查看完整版本: Unity包体优化