==================================================

CPU性能开销过大

项目运行过程中高于33ms的帧数占比:建议值 < 20.00%

优化建议

大于33ms的帧占比越高,项目运行时的卡顿情况、耗电和发热问题越严重。

1.可以查看平均耗时Top函数,进行详细分析,解决性能瓶颈。

  1. 平均耗时Top函数可以在区间报告和测试概况中被查看。

项目运行过程中高于55ms的帧数占比

建议值 < 5.00%

优化建议

大于55ms的帧占比越高,项目运行时的卡顿情况、耗电和发热问题越严重。

1.可以查看平均耗时Top函数,进行详细分析,解决性能瓶颈。

  1. 平均耗时Top函数可以在区间报告和测试概况中被查看。

==================================================

Animator.Initialize调用频率过高

Animator.Initialize每千帧调用次数 : 建议值 < 100.00

优化建议

1.对于带有Animator组件的GameObject,在资源实例化页面中,检查是否存在大量频繁的Instantiate操作,可以对此类资源进行缓存。

2.对于带有Animator组件的GameObject,在资源激活页面中,检查是否存在大量频繁的Active操作。

3.建议使用将Animator组件Enable/Disable的方式代替直接Active/Deactive其所在的GameObject的方式来控制人物。

MeshSkinning.Update耗时有效帧均值

建议值 < 3.00ms

优化建议

一般来说该值的大小取决于蒙皮网格(Skinned Mesh)的面片数和骨骼数。

1.建议开发团队勾选“GameObject.Optimize”。

2.控制场景中具有Animator Controller组件的GameObject,建议通过调整其Culling选项来降低视域体或一定范围外的动画组件更新。

Animators.Update耗时有效帧均值

建议值 < 3.00ms

优化建议

Animator.Update对应Unity新动画系统Mecanim。

1.需要研发团队在尽可能保证动画效果的同时,对模型的网格进行简化。建议使用Unity Asset Store中的SimleLOD插件对骨骼蒙皮网络进行简化。

2.控制Active的Animator数量。角色数目的增加会导致整体耗时都增加,各个函数CPU耗时随着角色数据的增加近似线性地增大。

3.建议排查“开启ApplyRootMotion”的Animator数量。通过Animators.Update的堆栈分析,可以看到Animator.ApplyBuiltinRootMotion占比较高。

4.开启Optimize Game Objects选项。在勾选的状态下,Unity在处理动画片段时,会移除Transform的层级信息,该设置对于Animators.Update的耗时提升都非常明显,可以极大程度上降低主线程的动画耗时。

5.控制Animator.Initialize触发频率。

6.检查AlwaysAnimate模式的Animator Controller数量。AlwaysAnimate状态下,当角色在屏幕外时,仍会继续产生Update开销。

Animation.Update耗时有效帧均值

建议值 < 3.00ms

优化建议

Animation.Update对应Unity老版本的动画系统。

1.建议研发团队尽可能使用Mecanim系统,而非旧版本Animation动画系统。

2.Mecanim动画系统的多线程计算性能较之老版本的单线程计算性能要高。Mecanim动画系统可以对GameObject开启 “Optimize Game Object” 选项。该选项为Unity引擎在4.3版本中加入的新功能,旨在优化Mecanim动画系统的底层计算开销。开启该选项,Animator.Update和MeshSkinning.Update的CPU占用均存在一定程度的降低。

3.Mecanim动画系统的Retargeting功能可以让多个不同的角色使用同一套的AnimationClip资源,从而进一步降低动画资源的内存开销。

==================================================

项目中平均帧率

建议值 > 25.00

优化建议

1.查看CPU占用Top函数,从高到低开始依次分析和优化。

2.查看GC占用Top函数,GC是大部分卡顿的主要原因。

3.查看脚本所造成的性能损耗。

4.降低游戏的渲染分辨率,手机帧率低的时候,减少每一帧要处理的像素数量。

UITime均值

UI模块耗时均值

建议值 < 5.00ms

优化建议

1.将UI元素进行动静分离。

2.避免将过多的UI元素集中在某些Canvas或UlPanel中

==================================================

ReservedTotal峰值(MB)

总体内存占用峰值

建议值 < 600.00MB

优化建议

项目运行时Unity引擎所统计的真实物理内存分配。

Unity项目中的内存占用主要由静态资源、AssetBundle 和Mono堆内存组成。

1.使用UPR资源检测工具检测项目资源。查看资源的内存占用是否合理,并且是否存在资源冗余的问题。

2.查看Mono堆内存使用的合理性:ReservedMono峰值是否超过了UPR推荐值,ReservedMono是否存在持续上升的趋势。

3.Mono堆内存占用量的主要来自于配置文件的读取和解析操作,查看配置文件读取操作的堆内存使用的合理性。

4.查看AssetBundle在内存中的驻留情况。

5.一般来说,Resources文件夹下资源文件越多,则ResourceManager的内存占用越大。可以通过Unity Profiler工具来查看ResourceManager的内存占用。

ReservedMono峰值(MB)

Mono堆内存占用峰值

建议值 < 80.00MB

优化建议

项目运行时Mono管理和分配的托管堆内存。

对于绝大多数基于Unity引擎开发的项目而言,除iOS平台外,其托管堆内存是由Mono分配和管理的。

1.关注Reserved Mono和Unused Mono,防止内存泄漏。

2.关注堆内存分配Top的函数,定位是否有分配不必要堆内存的代码存在。

3.不要在Update、FixUpdate或较Mono堆内存占用高调用频率的函数中开辟堆内存Class/Container/Array等。

4.检测配置文件读取操作的堆内存分配情况,对于绝大部分堆内存来说,堆内存的主要分配量均来自于配置文件的读取和解析操作。

5.对自身Log的输出进行严格的控制,仅保留关键Log,以避免不必要的堆内存分配,在cpu->cpu函数性能页面中,可以找到LogStringToConsole函数的性能开销数据。

ReservedGFX峰值(MB)

GFXDriver内存占用峰值

建议值 < 280.00MB

优化建议

项目运行时用于渲染的资源所占用的内存,是为底层显卡驱动所反馈的内存分配量。

1.查看纹理资源、Mesh资源、Shader资源以及解析这些资源的相关库所分配的内存,定位性能瓶颈。

2.这部分内存与纹理内存、网格内存有重合,且已包含在总内存中。

GC调用频率

GC每千帧调用

建议值 < 2.00

优化建议

GC调用频率主要受堆内存影响。

1.针对Mono堆内存分析报告中的堆内存分配堆栈进行详细查看,尽可能避免不必要的堆内存分配,从而降低GC调用频率。

2.查看是否存在通过代码直接调用GC操作,如有,则尽可能减少其调用频率。

==================================================

Camera.Render 耗时有效帧均值(ms)

Camera.Render耗时超过15ms的帧占比 0%

建议值 < 5.00%

优化建议

在CPU->函数性能页面中,查看Camera.Render的性能详情,有助于快速定位渲染模块的性能瓶颈。

不透明渲染耗时有效帧均值(ms)

不透明渲染耗时有效帧均值

建议值 < 3.00ms

优化建议

1.不透明渲染耗时主要为场景中的不透明物体渲染所致,主要为蒙皮网格、地形和建筑等等。

2.关注性能堆栈中蒙皮网格(MeshSkinning.Render)的渲染开销。

3.通过Unity Frame Debugger对重点帧的渲染物体进行检测,查看其Draw Call Batching的合理性。

半透明渲染耗时有效帧均值(ms)

半透明渲染耗时有效帧均值

建议值 < 5.00ms

优化建议

1.渲染模块的渲染耗时主要为UI界面、粒子系统和其他半透明物体(花草、Sprite等)所致。

2.查看UI模块性能分析界面,重点观察UI模块和半透明渲染的CPU耗时走势是否一致。

3.如果一致,则重点优化UI模块的重建和Draw Call问题。

4.查看性能堆栈中粒子系统的CPU耗时走势,控制粒子系统的数量和粒子数量。

5.对于其他非UI和粒子系统的半透明渲染开销,则可通过UnityFrameDebugger对重点帧的渲染物体进行检测,查看其Draw Call Batching是否合理。

可视化蒙皮数量有效帧均值(个)

可视化蒙皮数量均值

建议值 < 50

优化建议

1.减少SkinnedMeshRenderer组件的数量。如果游戏中该模型并不会使用骨骼动画,可以将SkinnedMeshRenderer组件替换为MeshRenderer。

2.在导入模型时,可以选择不导入动画。

3.减少使用SkinnedMeshRenderer的对象的Mesh顶点数。

4.使用GPU Skinning。在硬件平台支持并且GPU资源足够的条件下,可以在Player Setting中启用GPU Skinning,将蒙皮任务从CPU转移到GPU。

==================================================

碰撞体数量峰值(个)

动态碰撞体数量+静态碰撞体数量

建议值 < 100

优化建议

动态碰撞体数量是拥有一个刚体属性的碰撞体的数量。

静态碰撞体数量是在GameObjects上的Collider components的数量,并且没有连接到游戏对象或它们的父配子的刚体组件。

Active Rigidbody峰值(个)

Active RigidBody数量峰值

建议值 < 50

优化建议

由物理引擎处理的未休眠的刚性部件的数量。

FixedUpdate.PhysicsFixedUpdate耗时(ms)

FixedUpdate.PhysicsFixedUpdate函数平均每帧调用次数

建议值 < 3.00

优化建议

1.更新频率过高说明其他模块的CPU耗时偏高。建议研发团队查看物理模块性能页面。

2.先优化其他模块的CPU耗时,当整体帧率表现好时,物理更新频率自然会下降。

3.如果项目不是重度依赖物理的项目,建议在Project Settings中修改降低物理更新频率,如1秒更新一次。

==================================================

Loading.UpdatePreloading 最高耗时(ms)

Loading.UpdatePreloading耗时峰值

建议值 < 2000.00ms

优化建议

Unity引擎最主要的加载函数。一般在切换场景时或主动动态加载资源时较大。

1.一般来说,加载资源越多、越复杂,则Loading.UpdatePreloading耗时越大。

2.建议研发团队查看“CPU函数性能”页面中Loading.UpdatePreloading函数的更为详细的性能信息。

AsyncReadManager.SyncRequest 耗时有效帧均值(ms)0.972

==================================================

ParticleSystem.Update 耗时有效帧均值(ms)

ParticleSystem.Update耗时有效帧均值

建议值 < 2.00ms

优化建议

ParticleSystem.Update指的是粒子系统更新的平均CPU耗时。

1.关注粒子系统数量峰值是否偏高。查看是否有过度缓存的现象。

2.关注Playing数量峰值是否偏高。查看是否能做些制作上的优化。

3.在中低端机型上降低粒子数、同屏粒子数,比如仅显示“关键”粒子特效或自身角色释放的粒子特效等,从而降低Update的CPU开销。

4.尝试关闭离当前视域体或当前相机较远的粒子系统,离近后再进行开启,从而避免不必要的粒子系统Update的开销。

5.尽可能降低粒子特效在屏幕中的覆盖面积,覆盖面积越大,层叠数越多,其渲染开销越大。

6.使用UPR粒子系统检测。

ParticleSystem.Update 最高耗时(ms)3.1

==================================================

Canvas.BuildBatch 耗时有效帧均值(ms)

Canvas.BuildBatch

1.执行Canvas的Batch build过程的底层代码计算量。

2.为UI元素合并的Mesh需要改变时所产生的调用。

3.通常Canvas.SendWillRenderCanvases()的调用都会引起Canvas.BuildBatch的调用。

4.另外,Canvas中的UI元素发生移动也会引起Canvas.BuildBatch的调用。

Canvas.SendWillRenderCanvases 耗时有效帧均值(ms)

Canvas.SendWillRenderCanvases

1.包含了C#脚本对Canvas组件的willRenderCanvases事件的订阅的调用。

2.为UI元素自身发生变化时所产生的调用。发生在canvas被渲染之前。

==================================================

Shader CreateGPUProgram 耗时均值(ms)

Shader.CreateGPUProgram耗时有效帧均值

建议值 < 20.00ms

优化建议

根据不同的平台对Shader源文件进行编译。如果Shader之前已经Cache,则只需要对Cache的Shader进行加载。此项数据突出,则需要检查是否有大量的Shader或者Shader变体在同一帧被加载编译。

1.推荐使用UPR资源检测工具检测项目资源。

2.查看Shader是否存在资源冗余的问题,应避免重复解析的问题出现。

==================================================

TexturesSize峰值(MB)

纹理资源内存占用峰值

建议值 < 210.00MB

优化建议

1.决定纹理资源大小的因素主要有三种:分辨率、格式和Mipmap是否开启。

2.降低分辨率,根据Game摄像机距离物体最近时,物体所占的像素大小来确定最大分辨率。

3.拆分透明通道(Alpha), 因为带Alpha通道的贴图 Unity会默认选择RGBA格式。

4.调整压缩格式,尽量选用当前平台支持的最高压缩格式。

5.禁用Mipmap。

6.启用Use Crunch Compression,Crunch是Unity支持的最新压缩格式,压缩比非常高。

7.推荐使用UPR资源检测工具检测项目资源。

8.考虑是否可以将其转换成硬件支持的纹理格式。

9.对于转成硬件格式效果不好的纹理,可尝试使用ChromaPack格式来进行完善。

==================================================

MeshesSize峰值(MB)

网格资源内存占用峰值

建议值 < 75.00MB

优化建议

项目运行中MeshesSize的峰值。

1.减少顶点,在可以实现美术效果的前提下,顶点越少越好。

2.开启Optimize Mesh选项。

3.推荐使用UPR资源检测工具检测项目资源。

==================================================

AnimationClipsSize峰值(MB)

动画资源内存占用峰值

建议值 < 75.00MB

优化建议

项目运行中AnimationClipsSize的峰值。

1.减小动画长度。

2.减少骨骼数量,删除无效的骨骼点。

3.减少关键帧密度,并减少导入的冗余关键帧。

4.减少动画精度,降低动画大小。

5.推荐使用UPR资源检测工具检测项目资源。

==================================================

AudioClipsSize峰值(MB)

音频资源内存占用峰值

建议值 < 30.00MB

优化建议

项目中音频资源的峰值。

1.减少音频同时使用的数量,加大压缩比率。

2.Load Type 改为Streaming,可以极大降低内存峰值。

3.建议较长的音频使用.mp3或.ogg格式,较短的音频使用.wav 或.aiff格式。

4.推荐使用UPR资源检测工具检测项目资源。

==================================================

MaterialsCount峰值(个)

材质资源数量峰值

建议值 < 300

优化建议

项目运行中Material数量峰值。

1.Material数量过多会导致渲染开销的增加。

2.对于Instance类型的冗余Material资源,使用MaterialPropertyBlock来替换Material属性操作,可以省去实体对象本身的开销。

3.对于非Instance类型的冗余Material,查看AssetBundle中是否存在冗余的资源。

4.推荐使用UPR资源检测工具检测项目资源。

MaterialsSize峰值(MB)

材质资源内存占用峰值

建议值 < 512.00KB

优化建议

建议研发团队通过具体资源信息页面来查看材质资源在项目运行时的使用情况。

==================================================

DrawCall峰值(次)

Draw Call数量峰值

建议值 < 500

优化建议

Windows端的Draw Call值可能会偏高,请以手机端的值为准

1.UI DrawCall数量建议控制在15-40之间,UI DrawCall过多或过少,都会增大性能的消耗。

2.查看渲染对象的DrawCall合批是否正确。

3.使用WinUpr进行测试,并记录RenderDoc,配合RenderDoc图形调试器,进行图形性能调优。

4.通过Unity Frame Debugger对重点帧的Draw Call使用及其渲染物体进行检测,查看其是否合理。

Tris峰值(面)

DrawCalls有效帧均值(次)

Draw Calls有效帧均值

建议值 < 200

优化建议

Windows端的Draw Call值可能会偏高,请以手机端的值为准

1.UI DrawCall数量建议控制在15-40之间,UI DrawCall过多或过少,都会增大性能的消耗。

2.查看渲染对象的DrawCall合批是否正确。

3.使用WinUpr进行测试,并记录RenderDoc,配合RenderDoc图形调试器,进行图形性能调优。

4.通过Unity Frame Debugger对重点帧的Draw Call使用及其渲染物体进行检测,查看其是否合理。

渲染的三角面片峰值

建议值 < 350000

优化建议

1.查看其渲染网格数量的合理性。

2.通过Culling Distance或Culling Group功能,加大对Game Object的裁剪力度。

3.简化场景网格。

4.使用WinUpr进行测试,并记录RenderDoc,配合RenderDoc图形调试器,进行图形性能调优。

5.通过Unity Frame Debugger对重点帧的渲染物体进行检测,查看其渲染网格量是否合理。

6.通过SimpleLOD、MeshBaker和Simplygon等网格简化工具对场景网格进行简化。

SkinnedMesh均值

可视化蒙皮数量均值

建议值 < 50

优化建议

1.减少SkinnedMeshRenderer组件的数量。如果游戏中该模型并不会使用骨骼动画,可以将SkinnedMeshRenderer组件替换为MeshRenderer。

2.在导入模型时,可以选择不导入动画。

3.减少使用SkinnedMeshRenderer的对象的Mesh顶点数。

4.使用GPU Skinning。在硬件平台支持并且GPU资源足够的条件下,可以在Player Setting中启用GPU Skinning,将蒙皮任务从CPU转移到GPU。

wWiseCPU耗时(ms)

原生采样率是48,000 Hz,所以wWise需要每21.333 ms(就是1,024 / 48,000)提交一个音频帧。

如果音频线程花21.333 ms来创建一帧,那么在Performance Monitor上它会显示为100% CPU。

所以,CPU时间(ms) = CPU百分比 * 21.333 ms。

==================================================

==================================================

==================================================