前言
正在学习Doctor 张.鑫大佬的移动游戏加载性能和内存管理,内容非常非常的干,所以我烧了很多开水,边喝边看,一边拿小本几做好笔记
本文只是关于前2章的内容笔记,关于各种资源的加载耗时
纹理资源加载耗时
重复加载十次,取平均值
纹理尺寸测试结论
1、纹理资源的分辨率对加载性能影响较大,分辨率越高,其加载越为耗时。设备性能越差,其耗时差别越为明显;
2、设备越好,加载效率确实越高。但是,对于硬件支持纹理(ETC1/PVRTC)来说,中高端设备的加载效率差别已经很小,比如图中的红米Note2和三星S6设备,差别已经很不明显。
纹理格式测试结论
1、纹理资源的格式对加载性能影响同样较大,Android平台上,ETC1和ETC2的加载效率最高。同样,iOS平台上,PVRTC 4BPP的加载效率最高。
2、RGBA16格式纹理的加载效率同样很高,与RGBA32格式相比,其加载效率与ETC1/PVRTC非常接近,并且设备越好,加载开销差别越不明显;
3、RGBA32格式纹理的加载效率受硬件设备的性能影响较大,ETC/PVRTC/RGBA16受硬件设备的影响较低。
网格资源加载耗时
网格面数加载耗时结论
1、资源的数据量对加载性能影响较大,面片数越多,其加载越为耗时。设备性能越差,其耗时差别越为明显;
2、随着硬件设备性能的提升,其加载效率差异越来越不明显。
相同面片数、不同顶点属性的加载效率测试
网格顶点属性测试结论
1、顶点属性的增加对内存和AssetBundle包体大小影响较大。与测试1中未引入Tangent顶点属性的网格数据相比,测试2中的网格数据在内存上均大幅度增加(增加量与网格顶点数有关),且AssetBundle大小同样有成倍(1~2)的增加。
2、顶点属性增加对于加载效率影响较大,且顶点数越多,影响越大。
网格加载结论
1、在保证视觉效果的前提下,尽可能采用“够用就好”的原则,即降低网格资源的顶点数量和面片数量;
2、研发团队对于顶点属性的使用需谨慎处理。通过以上分析可以看出,顶点属性越多,则内存占用越高,加载时间越长;
3、如果在项目运行过程中对网格资源数据不进行读写操作(比如Morphing动画等),那么建议将Read/Write功能关闭,既可以提升加载效率,又可以大幅度降低内存占用。
AnimationClip资源加载耗时
防范大于救灾!
资源加载耗时测试结论
- Optimal压缩方式确实可以提升资源的加载效率,无论是在高端机、中端机还是低端机上;
- 硬件设备性能越好,其加载效率越高。但随着设备的提升,Keyframe Reduction和Optimal的加载效率提升已不十分明显;
- Optimal压缩方式可能会降低动画的视觉质量,因此,是否最终选择Optimal压缩模式,还需根据最终视觉效果的接受程度来决定。
这里是说的一个动画精度的问题,unity的动画文件是一个txt,打开后可以把浮点数的精度,从小数点8位,压缩到3位。 在内存跟体积上都有很大提升
动画类型,Humanoid会比Generic类型小很多,其原理是因为Humanoid把动画数据转到了肌肉空间,从原来的xyzw四个值,变成了一个value值,所以体积小很多
Shader加载耗时
Shader解析耗时结论
1、Shader资源的物理体积与内存占用虽然很小,但其加载耗时开销的CPU占用很高,这主要是因为Shader的解析CPU开销很高,成为了Shader资源加载的性能瓶颈;
2、Mobile/Particles Additive在解析方面的耗时远小于Mobile/Diffuse、Mobile/Bumped Diffsue甚至Mobile/VertexLit;
3、除Mobile/Particles Additive外,其他三个主流Shader在加载时均会造成明显的降帧,甚至卡顿。因此,研发团队应尽可能避免在非切换场景时刻进行Shader的加载操作;
4、随着硬件设备性能的提升,其解析效率差异越来越不明显。
Shader解析耗时如何优化?
1、通过依赖关系打包,将项目中的所有Shader抽离并打成一个独立的AssetBundle文件,其他AssetBundle与其建立依赖;
2、Shader的AssetBundle文件在游戏启动后即进行加载并常驻内存,因为一款项目的Shader种类数量一般在50~100不等,且每个均很小,即便全部常驻内存,其内存总占用量也不会超过2MB;
3、后续Prefab加载和实例化后,Unity引擎会通过AssetBundle之间的依赖关系直接找到对应的Shader资源进行使用,而不会再进行加载和解析操作。
音频资源
结论
从包体大小来说,使用mp3包的体积会下来,如果对音质要求不大的,建议用mp3格式
背景音乐建议用Streaming + 开启Load in Background模式在子线程加载
技能音效可以使用Decompressed On Load,降低cpu开销,内存会大一些,不过技能音频都比较短
粒子系统加载耗时
建议材质剥离,不然每个粒子系统都要加载材质耗时变高
建议多个常用粒子系统,捆绑在一起加载
总结
本篇从以下几大块,列举了unity游戏加载的各类耗时
- 纹理资源加载
- 网格加载
- Animation加载
- Shader解析
- 音频资源
资源加载的优化是游戏性能优化非常重要的部分!
各种类型的资源,都可以通过合理的设置跟取舍,极大的影响到我们的加载耗时跟内存开销。
比如shader,去掉FallBack,就可使MobileDiffuse之解析耗时从59.9降低到27.6ms,降低了64%
视频里有一句话说的很好:
防范大于救火
这章就结束啦,后面还有加载卸载的管理,以及实例化、内存优化。
好了我要睡觉了 —— 02:43
参考: