资源优化

EditorSetting

LayerCollisionMatrix

层级碰撞矩阵,没必要每层都去检测碰撞

检查Physics设置中的LayerCollisionMatrix设置

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

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

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

检查Physics2D中LayerCollisionMatrix设置

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

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

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

FBX

检查读/写标志

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

检查动画资源压缩方式

动画资源使用最佳压缩方式可以提高加载效率,查看Inspector -> Animation Tab -> Anim. Compression选项

检查动画资源的OptimizeGameObjects选项

动画资源应该勾选OptimizeGameObjects选项来减少CPU消耗,查看Inspector -> Rig Tab -> Optimize Game Objects选项

检查FBX资源顶点数

FBX资源资源中有太多的顶点, 请检查是否必要,500以下,Custom Parameters: vertexCountLimit : 500

Animation

检查动画曲线精度

动画曲线精度过高会增加动画占用内存; 此规则仅面向以文本格式序列化的*.anim文件中的浮点精度 Custom Parameters: precision : 5 用文本编辑器打开.anim动画文件,修改m_EditorCurves::curve::m_Curve下的float值的精度。建议用脚本直接将此文件中所有float精度都调小。

自己编写的优化工具:工具

Prefab

检查Skinned Mesh Renderer

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

Scene

检查场景中的Audio Listener

一个场景不应包含多个Audio Listener 检查场景中所有GameObject下的Audio Listener组件

检查场景中mesh collider

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

检查场景渲染设置

在移动平台,建议在渲染设置中关闭对雾的渲染以节省计算资源。 检查Window -> Rendering -> Lighting Settings -> Scene -> Other Settings -> Fog选项

检查Canvas中的component数量

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

检查场景Animator组件中的cullingMode

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

Shader

检查Shader中纹理数量

Shader中过多的纹理可能会增加GPU消耗 Custom Parameters: textureCountLimit : 3

Texture

检查纹理读/写标记

开启纹理资源的读/写标志会导致双倍的内存占用 检查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选项

纹理资源大小2的幂次

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

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

检查纯色纹理

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

Custom Parameters: heightThreshold : 16widthThreshold : 16

检查重复纹理

检查重复纹理

检查精灵图纹理填充率

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

Custom Parameters: fillRateThreshold : 0.5onlyCheckSprite : True

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

Script

避免分配托管内存

以下方法会导致分配托管内存,给出了替代的方法

问题解决方案
Component.GetComponentsInChildren()替代:GetComponentsInChildren(bool includeInactive, List result)
AnimationCurve.keys替代:AnimationCurve.AddKey()/MoveKey()/RemoveKey()
Resources.FindObjectsOfTypeAll()Resources.FindObjectsOfTypeNonAlloc()
Object.FindObjectsOfType()尽量避免在频繁更新的代码中调用此方法。理想情况下,该方法应该只在初始化期间使用,如果需要重用结果,则应该缓存结果。
Linq 会分配大量的托管内存强烈建议不要在任何频繁更新的代码中使用Linq。完全禁止在项目中使用它,或者将它限制在初始化代码中,并少量使用它。
Component.GetComponentsInParent()替代:GetComponentsInParent(bool includeInactive, List results)
Texture2D.GetPixels()替代:Texture2D.GetRawTextureData()

减少CPU使用

以下方法会导致CPU性能的问题,给出了替代的方法

问题解决方案
AddComponent()尽量避免在频繁更新的代码中获得此属性。更喜欢从预制件实例化游戏对象将所有必要的组件。
Instantiate()操作昂贵,避免经常使用,内存池处理
反射删除依赖于反射的代码,或尽量减少反射的使用,特别是在初始化之外。
空方法任何空的MonoBehaviour魔法方法都将包含在构建中并执行,移除任何空的方法

检查空的MonoBehavior Update方法

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

检查OnGUI方法

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

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