EarlyUpdate.UpdatePreloading
Loading.UpdatePreloading :在异步加载/卸载场景,异步加载AssetBundle,加载AssetBundle中的Asset,加载Resource文件夹中资源,调用UnloadUnusedAssets时会产生这个tag.如果加载操作要求等待完成,则会在子tag中看到AsyncOperationComplete, 否则在子tag中会看到IntegrateAssetsInBackground
UpdatePreloading:根据加载线程的优先级取得可用时间片,在时间片耗尽前,尝试最多次的加载资源。每次加载资源会产生一次kPreloadSingleStep tag。Unity Preloading的线程可用时间片每次为4ms。
Preload Single Step:每次执行时,先确保preload manager线程已经启动,然后尝试向显卡异步传输数据(WEBGL平台不支持这一特性)。异步上传的时间片和buffer大小默认分别为2ms和4MB的循环缓冲区。通过Quality Setting可以调整默认大小。然后查询异步加载队列中第一位的任务是否完成,以及和当前任务相关的分时整合任务是否完成。如果以上任务都执行完,会执行一起在主线程独占状态下的资源整合。
Application.LoadLevelAsync Integrate:在加载场景时(首次加载,普通加载或者叠加加载)会出现该tag。对于普通加载场景,引擎首先会卸载场景(参见UnloadScene)然后加载新的场景。而叠加加载则会直接加载并激活目标场景中的Objects。
平均帧率项目中平均帧率。推荐值 > 25 帧
UPR优化建议:
1.查看CPU占用Top函数,从高到低开始依次分析和优化。
2.查看GC占用Top函数,GC是大部分卡顿的主要原因。
3.查看脚本所造成的性能损耗。
4.降低游戏的渲染分辨率,手机帧率低的时候,减少每一帧要处理的像素数量。
ReservedTotal
ReservedTotal峰值项目运行时Unity引擎所统计的真实物理内存分配。
对于绝大多数平台而言,Reserved Total ≈ Reserved (Unity + Mono + GFX + FMod)推荐值 < 230MB
UPR优化建议:
Unity项目中的内存占用主要由静态资源、AssetBundle 和Mono堆内存组成。
1.使用UPR资源检测工具检测项目资源。查看资源的内存占用是否合理,并且是否存在资源冗余的问题。
2.查看Mono堆内存使用的合理性:ReservedMono峰值是否超过了UPR推荐值,ReservedMono是否存在持续上升的趋势。
3. Mono堆内存占用量的主要来自于配置文件的读取和解析操作,查看配置文件读取操作的堆内存使用的合理性。
4..查看AssetBundle在内存中的驻留情况。
ReservedUnity
ReservedUnity峰值为Unity引擎自身逻辑所需要使用的内存分配,包括各模块管理类的内存占用,序列化信息、WebStream、资源的内存占用等等。推荐值 < 150MB
UPR优化建议
1. 排查是否存在AssetBundle没有被清理干净的情况。
2. Assetbundle打包的时候,如果只有一个引用的就不设置AssetbundleName。减少Assetbundle文件数量。
3. 使用SerializedFile加载Assetbundle完之后,即时Unload。
4. 对于占用WebStream较大的AssetBundle文件,使用LoadFromCacheOrDownLoad或CreateFromFile来进行替换,即将解压后的AssetBundle数据存储于本地Cache中进行使用。
5. 分析纹理、网络、动画、音频和材质等资源的内存占用性能瓶颈,针对性地进行优化。
ReservedMono
ReservedMono峰值项目运行时Mono管理和分配的托管堆内存。
对于绝大多数基于Unity引擎开发的项目而言,除iOS平台外,其托管堆内存是由Mono分配和管理的。推荐值 < 80MB
UPR优化建议
1. 关注Reserved Mono和Unused Mono,防止内存泄漏。
2. 关注堆内存分配Top10的函数,定位是否有分配不必要堆内存的代码存在。
3. 不要在Update、FixUpdate或较高调用频率的函数中开辟堆内存Class/Container/Array等。
4. 对自身Log的输出进行严格的控制,仅保留关键Log,以避免不必要的堆内存分配。
内存
Total Reserved/Used
Reserved是Unity向系统申请的总内存,但是并不包含第三方库的自身分配内存和系统缓存;Used是当前正在使用的总内存。
Unity引擎为避免频繁向操作系统申请开辟内存,因此开启较大一块内存作为缓存,即Total Reserved。
所以在运行时,Unity引擎首先是向Reserved中来申请内存,当不使用时也是先向Reserved中释放内存,从而来保证游戏运行的流畅性。
当Reserved中空内存不够用时,Unity引擎才会再次向操作系统申请开辟内存。
占据较大内存开销的是这两处:WebStream 和 SerializedFile。
WebStream :当使用new WWW或CreateFromMemory来加载AssetBundle时,Unity引擎会加载原始数据到内存中并对其进行解压,因此加载后WebStream的大小会很大。
因此,当项目中存在通过new WWW加载多个AssetBundle文件,且AssetBundle又无法及时释放时,WebStream会占用较大内存。
Mono Reserved/Used
Mono内存表示游戏中脚本分配的内存,其中游戏逻辑由开发人员编写,因此容易出现内存问题。
“托管堆内存”代表Mono“应该”自动地改变堆的大小来适应程序所需要的内存,并且定时地使用垃圾回收(Garbage Collect)来释放已经不需要的内存。
往往开发人员会忘记清除对不再需要使用的内存的引用,从而导致Mono认为这块内存一直有用,无法回收,从而造成内存泄漏。
Mono内存泄漏会使空闲内存减少,GC频繁,mono堆不断扩充,最终导致游戏内存占用的升高。
由于Mono自身的限制,其堆内存分配是 “只升不降” 的,即:Mono的堆内存一旦分配,就不会返还给系统。
最终导致内存过高,进程被操作系统Kill或者崩溃。
UI
纹理资源峰值项目中纹理资源的峰值。推荐值 < 50 MB
UPR优化建议
决定纹理资源大小的因素主要有三种:分辨率、格式和Mipmap是否开启。
1.降低分辨率,根据Game摄像机距离物体最近时,物体所占的像素大小来确定最大分辨率。
2.拆分透明通道(Alpha), 因为带Alpha通道的贴图 Unity会默认选择RGBA格式。
3.调整压缩格式,尽量选用当前平台支持的最高压缩格式。
4.禁用Mipmap。
5.启用Use Crunch Compression,Crunch是Unity支持的最新压缩格式,压缩比非常高。
标签:Reserved,函数,记录,Mono,unityprofiler,Unity,AssetBundle,内存,加载 From: https://www.cnblogs.com/mcyushao/p/16592720.html