https://blog.uwa4d.com/archives/livebroadcast6-8.html
因为这篇文章没有提供PPT供参考 所以写这一篇文章来记录一下1个多小时的视频中讲解的哪些优化点,
文章中的图片都是UWA收集的
如果你不能"定位"它,就没办法"优化"它
"If you cannot measure it you cannot improve it." ---Lord Keivin
函数名称:
自定义逻辑代码
更为具体的加载耗时
合理使用资源
Unity加载模块深度解析(纹理篇)
https://blog.uwa4d.com/archives/LoadingPerformance_Texture.html
Unity加载模块深度解析(网格篇)
https://blog.uwa4d.com/archives/LoadingPerformance_Mesh.html
Unity加载模块深度解析之动画资源
https://blog.uwa4d.com/archives/Loading_AnimationClip.html
动画资源:4000帧,133s,58根骨骼
降低精度
KeyFrame-Opt降低数据精度,从8位减至3位
动画类型
Generic
Humanoid(建议) 性能提升,降低AnimationClip数量,降低使用的种类
Unity加载模块深度解析(Shader篇)
https://blog.uwa4d.com/archives/LoadingPerformance_Shader.html
Keyword的降低确实可以大幅降低Shader的解析时间,进而提升加载效率。
占用内存空间图
Streaming << Compressed + Vorbis << 其他设置
Vorbis的Quality可以进一步控制,建议50%(个人使用1%效果还行)
音频资源加载效率
1.0x 一倍数 n.0x n倍数
不急于播放的音频,可以开启Load In Background来提高加载性能,比如背景音乐
需要实时播放的音频,比如开枪,走路,打击就不要开启了
运行时CPU消耗
总结一下:
Unity官网链接
https://docs.unity3d.com/Manual/class-AudioClip.html
粒子系统经常使用,也经常疏忽
粒子系统加载Material耗时非常大,单独加载多个粒子耗时会翻倍
建议一个AssetBundle包中保存多个粒子,一次性加载多个粒子的耗时增加相对来说少很多
测试实验数据 AssetBundle压缩格式
测试加载方式: 红米Note2
测试结果:ETC1 ,测试100次取平均值
LoadFromCacheOrDownload为什么LZMA很快(因为第一次加载后缓存了)
测试结果:RGB24 ,测试100次取平均值
测试结果
AssetBundle加载问题-Coroutine次数
因为每加载完一个AssetBundle后就yield return跳过当前帧
导致加载小的零碎资源包时CPU没有跑满,也就导致了加载总时间过长
自己压缩,建议采用 Gzip+LoadFromFile(Async)
压缩比例图
解压时间图
压缩时间图
以上是AssetBundle的说明和加载解压方式的比较
从上图我们可以发现问题,这个资源被加载和卸载了很多次
但是内存驻留的情况却是一直常驻
这是因为每次卸载资源后立刻加载了资源,导致了性能上的浪费
同步异步加载时间对比
AssetBundle.Load VS AssetBundle.LoadAsync
LoadALL VS Load OneByOne
做一个特殊的测试
使用10张相同的 ETC1格式 1024*1024分辨率 LZ4压缩格式 在 红米Note2上测试加载效率
AssetBundle资源加载小结
优化实例化次数,添加缓存池
如何优化:
Active/Deactive频率和耗时
大部分情况下Active/Deactive比Instantiate/Detroy要好
有两类GameObject建议不要频繁切换
建议把不想显示的GameObject移动到视野外面去,并把Component给disabled 掉,等需要的时候移回视野内并enabled
这样就没有重建的CPU开销
勿以恶小而为之,勿以善小而不为 ---刘备
内存使用是否合适
统计市面上MMO游戏和ARPG游戏的资源分布图
纹理资源:(建议不要大于150MB)
纹理资源如何优化?(UWA mipmap工具 可以给纹理分辨率建议)
网格资源 (建议缩减到20mb以下)
优化Tangents数量
动画资源
优化方式上文讲解了 减少动画精度,设置动画模式
音频资源 (建议小于15MB)
RenderTexture
粒子系统
提高粒子系统利用率
资源冗余
不同的AssetBundle包包含相同的资源
如何做到零冗余?
Unity 5.x AssetBundle零冗余解决方案
https://blog.uwa4d.com/archives/1577.html
-数量尽可能保持在60以下(特别是Android平台)
5.6以前不论多小的AB都占有0.5MB的内存空间,5.6以后降低至16KB
UGUI建议1w帧分配内存小于30MB
NGUI建议1w帧分配内存小于50MB
关注一次性分配(1MB以上)
关注谁在分配
泄漏和缓存仅是一线之隔
每1000帧获取准确的驻留堆内存和变量数
查找堆内存增量:
5.4 UWA直播回顾:Unity游戏的代码堆内存优化
https://blog.uwa4d.com/archives/1766.html
平均三天即可大幅改善堆内存泄漏问题
空杯心态,用数据说话,一切经验归零
人之所以言之凿凿
是因为知道的太少
---弗郎索瓦·基佐