这里讨论的减小包体大小,又因为很多项目会采用基础包与资源下载包分离的策略,所以减少基础安装包(首包)的尺寸大小是最头等的诉求,特别是以 WebGL 为目标进行发布时,必须保持较低的构建大小,让用户在内容启动之前等待合理的下载时间。
先说说代码的优化策略:代码精简,主要指导思想就是剔除运行时不必要的库(包括Shader)。
代码
1 Strip Engine Code
2 Striping Level
- 需要测试,看项目复杂度,当然Minimal最保险(use micro mscorlib)
- 考虑:Don’t use anything that lives in System.dll or System.Xml.dll in your code. These libraries are not compatible with micro mscorlib.
3 精简Package
- Build-In package
- 源码层很多模块之间是有依赖的,定制引擎的性价比不高
- 但是仍然可以减小C#侧的DLL,但比如音频功能,源码层并没有彻底删除C++代码
- 常见可以排除的有XR/VR,Ai,Terrain,Analytics等
- 3rd package,毫无疑问清楚未使用的,和选择更轻量的库
- 选择Mono编译器;如果强制64位,则Mono64(需重编译Mono),或选择IL2CPP
- 设置API兼容等级为.NET Standard 2.1(.net2.0 subset)
- 减少支持的CPU目标平台架构
- 避免将泛型容器与值类型(包括结构体)组合使用,而且对GC不友好。Avoid generic containers in combination with value types, including structs.
- 确保使用Release编译
美术资源
是大头,其中又以贴图为尤。
1 艺术资源类型与压缩
- 3D模型
- Mesh:比如顶点数量过多,存在冗余的多套UV等
- 材质
- 贴图
- 动画复杂度控制
- 动画文件尺寸优化
- Animation.Compression建议开启,去掉多余的关键帧。
- 贴图
- 精度
- 压缩格式:Android(ETC1/ETC2)iOS(PVRT)
- 图集
- 拼接
- 九宫格
- 音频:推荐设置
- IOS平台使⽤MP3格式,Android平台使⽤Vorbis格式
- 较⻓的背景⾳乐⽤Streaming
- 移动平台通常不需要⽴体声,Force to Mono改成单声道
- 最⾼采样率控制在22KHZ
2 无效资源
工程迭代的必然结果,必须清理。
3 资源引用关系
可导致打包重复拷贝,必须建立清晰的资源管理规则。
一些工具
- UPR静态资源检测 UPR – Unity专业性能优化工具
资源分离
分离资源,Resource和StreamingAssets目录保持尽可能少的内容,待基础包安装之后以按需下载的方式进行。基础下载包与更新机制的分包策略,并不减小总量
- 特别是Resource目录,副作用还包括增加应用启动时间(在程序启动时建立索引,复杂度是线性的)Scalability不是很好,只适合放一些配置文件
- StreamingAssets目录的资源不会进行压缩
Auto Streaming
优化了首包大小和更新包大小,对包体,Mesh,纹理,动画,音频,等资源皆有效
特别对于未做基础包+资源包策略的应用来说,体验提升的更为明显
默认的应用以低精度资源运行,Streaming机制会自动在后台下载相应的高精度资源进行替换,从表现上看会有一个类似从模糊到清晰的过程
其他
BuildSetting里面的Scene保持只有一个