当前位置: 代码迷 >> 综合 >> Unity UPR 优化建议
  详细解决方案

Unity UPR 优化建议

热度:42   发布时间:2024-02-24 04:39:42.0

---------------------------------------

平均帧率项目中平均帧率。推荐值 > 25 帧

UPR优化建议

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

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

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

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

---------------------------------------

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峰值为Unity引擎自身逻辑所需要使用的内存分配,包括各模块管理类的内存占用,序列化信息、WebStream、资源的内存占用等等。推荐值 < 150MB

UPR优化建议

1. 排查是否存在AssetBundle没有被清理干净的情况。

2. Assetbundle打包的时候,如果只有一个引用的就不设置AssetbundleName。减少Assetbundle文件数量。

3. 使用SerializedFile加载Assetbundle完之后,即时Unload。

4. 对于占用WebStream较大的AssetBundle文件,使用LoadFromCacheOrDownLoad或CreateFromFile来进行替换,即将解压后的AssetBundle数据存储于本地Cache中进行使用。

5. 分析纹理、网络、动画、音频和材质等资源的内存占用性能瓶颈,针对性地进行优化。

---------------------------------------

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

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

UPR优化建议

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

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

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

4. 对自身Log的输出进行严格的控制,仅保留关键Log,以避免不必要的堆内存分配。

在cpu - cpu函数性能页面中,可以找到LogStringToConsole函数的性能开销数据,帮助定位性能瓶颈。

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

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

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

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

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

---------------------------------------

ReservedGFX峰值项目运行时用于渲染的资源所占用的内存。推荐值 < 100MB

UPR优化建议

GFXDriver内存占用主要由渲染相关的资源量组成。

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

------------------CPU性能占用Start---------------------
帧占比:项目运行过程中高于33ms的帧数占比。推荐值 < 10%

项目运行过程中高于50ms的帧数占比。推荐值 < 5%

UPR优化建议

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

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

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

---------------------------------------

均值:有效帧为在项目区间内,该项参数非0的帧。

不超过5ms的帧占比 = 0.42%  推荐值 不超过5ms的帧占比 > 95%

UPR优化建议

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

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

---------------------------------------

Script GC 均值(kb)项目中Script GC的均值。推荐值 < 51.2KB

UPR优化建议

查看GC占用Top函数,定位内存定位性能瓶颈。

---------------CPU性能占用End------------------------

纹理资源峰值项目中纹理资源的峰值。推荐值 < 50 MB

UPR优化建议

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

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

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

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

4.禁用Mipmap。

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

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

---------------------------------------

网格资源峰值项目中网格资源的峰值。推荐值 < 20 MB

UPR优化建议

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

2. 开启Optimize Mesh选项。

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

---------------------------------------

动画资源峰值项目中动画资源的峰值。推荐值 < 15 MB

UPR优化建议

1. 减小动画长度。

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

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

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

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

---------------------------------------

音频资源峰值项目中音频资源的峰值。推荐值 < 15 MB

UPR优化建议

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

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

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

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

---------------------------------------

MaterialsCount峰值(个) 项目运行中Material数量峰值。推荐值 < 300(个)

UPR优化建议

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

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

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

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

---------------------------------------

DrawCall峰值项目中Draw Call峰值。

Windows端的Draw Call值可能会偏高,请以手机端的值为准。推荐值 < 250(次)

不超过200次的帧占比 = 18.13%

推荐值 不超过200次的帧占比 > 95%

UPR优化建议

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

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

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

---------------------------------------

Triangles峰值(面)推荐值 < 200000(面)

UPR优化建议

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

2.加大对Game Object的裁剪力度。

3.简化场景网格。

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

---------------渲染模块Start------------------------

Camera.Render 耗时有效帧均值(ms)有效帧为在项目区间内,该项参数非0的帧。

不超过15ms的帧占比 = 97.13% 推荐值 不超过15ms的帧占比 > 95%

UPR优化建议

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

---------------------------------------

可视化蒙皮数量有效帧均值(个)有效帧为在项目区间内,该项参数非0的帧。推荐值 < 50

UPR优化建议

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

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

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

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

----------------渲染模块End-----------------------

------------------物理模块Start---------------------

Contacts峰值(个)在现场所有的碰撞器之间的接触对总数,包括触发重叠对的数量。

Contacts 数量越大,则表明碰撞物体的数量越多,CPU开销越大。

------------------------------------------

Active Rigidbody峰值(个)由物理引擎处理的未休眠的刚性部件的数量。

推荐值 < 50

------------------------------------------

动态碰撞体峰值(个)拥有一个刚体属性的碰撞体的数量。

碰撞体总数峰值 : 485

推荐值 : 动态碰撞体+静态碰撞体 < 100

------------------------------------------

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

碰撞体总数峰值 : 485

推荐值 : 动态碰撞体+静态碰撞体 < 100

-------------------物理模块End--------------------

-------------------动画模块Start --------------------

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

---------------------------------------

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

------------------动画模块End ---------------------

------------------加载模块Start ---------------------

Loading.UpdatePreloading 最高耗时(ms)

------------------ ---------------------

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

--------------------加载模块End -------------------

------------------粒子系统Start ---------------------

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

------------------ ---------------------

ParticleSystem.Update 最高耗时(ms)

--------------------粒子系统End -------------------

------------------UI模块Start ---------------------

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

------------------ ---------------------

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

--------------------UI模块End -------------------

------------------Shader模块Start ---------------------

Shader Parse 耗时有效帧均值(ms)

------------------ ---------------------

Shader Parse被调用帧数(次) Shader.Parse被调用的帧数。推荐值 < 5(次)

UPR优化建议

Shader.Parse的调用频率较高,则Shader被重复解析的可能性较大。

Shader资源内存占用较小,在预加载后,可以进行缓存。

------------------ ---------------------

Shader CreateGPUProgram 耗时均值(ms) 推荐值 < 20(ms)

UPR优化建议

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

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

--------------------Shader模块End -------------------

TotalPss 峰值(MB) 项目中TotalPss的峰值。推荐值 < 450 MB

UPR优化建议

1.通过“设备内存”趋势图,并配合截图,查看Pss值峰值处的合理性。

2.不同测试设备上Pss的统计数据会有不同。

3.优先查看第三方插件所导致的内存占用。

4.通过Lua的性能分析数据,查看Lua堆内存是否过高。

5.查看其他Native的代码是否导致过高的内存占用。

------------------ ---------------------

--------------------Animation -------------------

检查动画曲线精度

动画曲线精度过高会增加动画占用内存; 此规则仅面向以文本格式序列化的*.anim文件中的浮点精度

Custom Parameters: precision : 5

 用文本编辑器打开.anim动画文件,修改m_EditorCurves::curve::m_Curve下的float值的精度。建议用脚本直接将此文件中所有float精度都调小。

动画曲线精度应小于5

Animation Scale  动画不应具有缩放曲线

------------------Audio---------------------

Audio Android Compression Format  检查安卓平台的音频压缩格式

Audio iOS compression format 检查iOS平台的音频压缩格式

启用Force to Mono

如不需要立体声,开启forceMono可以减少内存和磁盘占用

 检查Inspector -> Force To Mono选项

音频应该启用forceMono,以节省存储和内存

音频加载类型

检查音频加载类型

 检查Inspector -> (Platform Tab) -> Load Type选项

default 的常规音效应使用CompressedInMemory

default 的音乐应该使用Streaming

------------------EditorSetting---------------------

检查GraphicsJobs设置

这项设置会为图形任务开启多线程. 但这个是实验性质的, 会引起新的问题. 请自行测试.

 检查Editor -> Project Settings -> PlayerSettings -> Graphic Jobs(Experimental)*的设置

尝试开启graphicJobs并测试

Editor AndroidManagedStrippingLevel Setting

Android设置中的ManagedStrippingLevel选项不应为Low或者Disabled

Editor BakeCollisionMeshes Setting

应设置开启BakeCollisionMeshes

CompanyName should be set 应设置CompanyName

Editor AccelerometerFrequency iOS Setting

iOS设置中的AccelerometerFrequency选项应为 Disabled

Editor Architecture iOS Setting

iOS设置中的Architecture选项不应为Universal

Editor GraphicsAPIs iOS Setting

在 iOS 的 GraphicsAPIs 设置里应只包含 Metal

Editor iOSManagedStrippingLevel Setting

iOS设置中的ManagedStrippingLevel选项不应为Low

Build Target Icons should be set  应设置Build Target Icons

Project Use Resources Folder  不建议使用Resources系统来管理asset

Editor StripEngineCode Setting  应设置开启StripEngineCode

检查Physics中的AutoSyncTransforms设置

AutoSyncTransforms选项是为了兼容老版本的Unity而设立的, 会增加CPU的使用

 检查Editor -> Project Settings -> Physics -> Auto Sync Transforms的设置

在Physics设置中开启AutoSyncTransforms会增加CPU的使用

在Physics2D设置中应关闭AutoSyncTransforms

检查Physics2D中LayerCollisionMatrix设置

这会增加CPU的负担, 应该取消勾选那些没有必要的格子

 检查Editor -> Project Settings -> Physics2D -> Layer Collision Matrix的设置

在Physics2D设置中LayerCollisionMatrix中的格子不应该都勾选上

检查Graphics中StandardShaderQuality设置

这会增加编译时间和包体积, 除非你想要支持很多性能跨度很大的设备

 检查Editor -> Project Settings -> Graphics -> Tiers -> Standard Shader Quality的设置

StandardShaderQuality选项在所有Graphics Tier中应相同

------------------ FBX---------------------

检查读/写标志

开启FBX资源的读/写标志会导致双倍的内存占用

FBX资源的读/写标志应该被禁用

检查动画资源压缩方式

动画资源使用最佳压缩方式可以提高加载效率

 查看Inspector -> Animation Tab -> Anim. Compression选项

动画资源应该使用最佳压缩方式

Mesh OptimizeMesh 应为网格资源启用OptimizeMesh

检查FBX资源定点数

FBX资源资源中有太多的顶点, 请检查是否必要

Custom Parameters: vertexCountLimit : 500

FBX资源资源中有太多的顶点

------------------Mesh---------------------

Mesh Read&Write Flag 应为网格资源禁用读/写标志

------------------Prefab---------------------

Prefab Max Particle Limit 渲染Mesh的粒子系统不宜设置过高的粒子总数

检查粒子系统的发射速率

当粒子系统渲染Mesh时(Inspector: Particle System -> Renderer -> Render Mode == Mesh), 相比于渲染Billboard时计算资源消耗会明显上升,因此需要对粒子发射速率加以限制

Custom Parameters: emitRateLimit : 5

 检查Inspector -> Particle System -> Emission -> Rate over Time/Distance配置

渲染Mesh的粒子系统不宜设置过高的粒子发射速率

检查Skinned Mesh Renderer

启用Skinned Motion Vectors会使渲染器同时使用当前帧和上一帧的蒙皮网络来渲染目标的动画以提高精度,从而需要双倍大小的缓冲区并占用双倍的显存

启用Skinned Motion Vectors将以消耗双倍内存为代价提高蒙皮网格的精度

检查网格读/写标记

被预制件关联的网格资源应该关闭读/写标记

------------------Scene---------------------

检查场景未添加tag的GameObject

场景中的所有GameObject都应当添加tag

场景包含未添加tag的GameObject

检查场景中的Audio Listener

一个场景不应包含多个Audio Listener

 检查场景中所有GameObject下的Audio Listener组件

场景包含多个音频侦听器

检查场景中mesh collider

Mesh Collider可以在场景中提供更精细化的碰撞检测,随之而来也会消耗大量计算资源,建议审慎使用。

 检查场景中所有GameObject下的Mesh Collider组件

场景包含了mesh collider

检查场景渲染设置

在移动平台,建议在渲染设置中关闭对雾的渲染以节省计算资源。

 检查Window -> Rendering -> Lighting Settings -> Scene -> Other Settings -> Fog选项

在移动平台,应在设置里关闭雾的渲染

检查场景中的Rigidbody

静态GameObject的Rigidbody模块是无用的。

静态GameObject不应关联Rigidbody

检查Canvas中的component数量

包含太多组件的Canvas可能会影响UI刷新的性能,并进一步影响应用的帧率。

包含太多组件的Canvas可能会影响UI刷新的性能

检查场景Animator组件中的ApplyRootMotion选项

如果不需要进行根骨骼动画位移, 建议关闭场景中Animator组件的applyRootMotion选项。

场景中包含勾选了applyRootMotion选项的Animator组件

检查场景Animator组件中的cullingMode

场景中Animator组件的cullingMode是AlwaysAnimate会增加CPU使用率。

场景中包含cullingMode为AlwaysAnimate的Animator组件

------------------Script---------------------

检查空的MonoBehavior Update方法

MonoBehavior脚本不应具有空的Update方法

MonoBehavior脚本不应具有空的update方法

检查OnGUI方法

由于内存使用率高,不应使用OnGUI方法

 IMGUI是过时的UI系统,仅建议在开发调试时使用。

由于内存使用率高,不应使用OnGUI方法

------------------Shader---------------------

检查Shader中纹理数量

Shader中过多的纹理可能会增加GPU消耗

Custom Parameters: textureCountLimit : 3

Shader中的纹理个数应小于3

------------------SpriteAtlas ---------------------

检查图集读/写标记

开启图集资源的读/写标志会导致双倍的内存占用

 检查Inspector -> Texture -> Read/Write Enabled选项

图集资源的读/写标志应被禁用

------------------Texture---------------------

Aniso level is not 1 纹理资源的Aniso级别不应大于1

Texture edge transparent

边缘有较大透明部分的纹理应裁剪以节省内存

Texture iOS compression format 检查iOS平台的纹理压缩格式

检查纹理读/写标记

开启纹理资源的读/写标志会导致双倍的内存占用

 检查Inspector -> Advanced -> Read/Write Enabled选项

纹理资源的读/写标志应被禁用

检查Mipmap标记

未压缩的纹理资源启用Mipmap标志会增加内存占用

 检查Inspector -> Advanced -> Generate Mip Maps选项

未压缩的纹理应该禁用mipmap

类型为Sprite的纹理应当禁用mipmap

Android平台纹理压缩格式

检查Android平台的纹理压缩格式

 如果希望对各平台统一设置压缩格式,检查Inspector -> Default -> Format选项; 如果希望为Android平台单独设置,打开旁边的Android选项卡,勾选Override for Android并检查下面的Format选项

对安卓平台使用默认值,但格式不是Automatic

纹理资源大小2的幂次

大小非2的幂次的纹理资源将无法使用ETC1和PVRTC压缩格式。在导入时自动伸缩为2的幂次也可能会导致内存占用或者贴图质量问题。

 检查Inspector -> Advanced -> Non-Power of 2选项. 建议使用原始大小为2的幂次的贴图.

纹理大小不是2的幂次

纹理的原始大小不是2的幂次;导入时自动扩大成2的幂次会导致内存占用上升

纹理的原始大小不是2的幂次;导入时自动缩小成2的幂次可能会影响贴图质量

检查纹理资源的过滤模式

纹理的过滤模式一般不建议使用Trilinear,会占用较高的计算资源。

 检查Inspector -> Filter Mode选项

纹理使用了Trilinear过滤模式

检查纹理资源alpha通道

如果纹理包含空的alpha通道,则应禁用'Alpha源'标志,否则会浪费这部分的内存。

 检查Inspector -> Alpha Source选项

应禁用具有空Alpha通道的纹理的‘Alpha源’标志

检查纯色纹理

纯色纹理的使用可能可以由一些设置来代替。由于某些情况下纯色纹理是必不可少的,此警告仅会在所使用的纹理较大(大于设定值, 默认为16x16)时才会触发。

Custom Parameters: heightThreshold : 16widthThreshold : 16

纯色纹理会浪费内存

检查纹理重复环绕模式

Repeat Wrap模式可能会导致纹理上出现意外的边缘

 检查Inspector -> Wrap Mode选项

重复环绕模式可能会导致纹理上出现意外的边缘

检查重复纹理

检查重复纹理

检查精灵图纹理填充率

填充率是精灵图分割后的有效面积与总面积的比率,较低的精灵图纹理填充率会导致显存的浪费。

Custom Parameters: fillRateThreshold : 0.5onlyCheckSprite : True

 尝试重新编排精灵图,尽量缩小总面积以提高填充率

sprite填充率低于 0.5

检查纹理是否过大

过大的纹理资源会更多的消耗内存

Custom Parameters: sizeThresholds : 512*512,1024*1024

纹理大于 1024 * 1024 纹理大于 512 * 512

------------------Video---------------------

Video size limit 导入的视频文件大小应小于某一限制,默认为256MB

---------------------------------------