以下条目主要针对移动端,大部分也适合PC端
1.性能优化应贯穿项目开发的全过程,如需求(性能能不能达到要求)、设计、开发、测试等。不能开发结束才优化性能。
2.官方推荐的优化工具是【Window】->【Profiler】
4.内存分析使用Memory Profiler
5.减少内存收集的影响(GC)
A.字符串
在 C# 中,字符串是引用类型,而不是值类型。减少不必要的字符串创建或操作。避免解析基于字符串的数据文件,例如 JSON 和 XML;以 ScriptableObjects 或 MessagePack 或 Protobuf 等格式存储数据。如果您需要在运行时构建字符串,请使用 StringBuilder 类。
B.Unity 函数调用
请注意,某些函数会创建堆分配。缓存对数组的引用,而不是在循环中间分配它们。此外,利用某些避免产生垃圾的函数;例如,使用 GameObject.CompareTag 而不是手动将字符串与 GameObject.tag 进行比较(返回一个新字符串创建垃圾)。
C.装箱
避免传递值类型变量代替引用类型变量。这会创建一个临时对象,随之而来的潜在垃圾(例如,int i = 123; object o = i)将值类型隐式转换为类型对象。
D.协程
虽然 yield 不会产生垃圾,但会创建一个新的WaitForSeconds 对象确实如此。缓存并重用 WaitForSeconds 对象,而不是在 yield 行中创建它。
E.LINQ 和正则表达式
这两者都会从幕后拳击中产生垃圾。如果性能有问题,请避免使用 LINQ 和正则表达式。
6.使用Use incremental GC拆分 GC 工作量
7.将不必要的逻辑移出 Update、LateUpdate、FixedUpdate。因为每帧都要执行这些函数。
8.如果确实需要使用更新,请考虑每 n 帧运行一次代码。
9.去掉空的函数,比如Start、Update、LateUpdate、FixedUpdate。
10.去掉调试输出信息,特别是Update、LateUpdate、FixedUpdate中的调试输出Debug.Log。
11.避免在运行时添加组件AddComponent
12.缓存游戏对象和组件
避免在 Update 方法中调用GameObject.Find、GameObject.GetComponent 和 Camera.main,应该在 Start 中调用它们并缓存结果。
错误的方式:
14.使用ScriptableObjects来保存参数。
15.关闭或降低Accelerometer Frequency
17.关闭Quality setting中不需要的项
18.关闭Physics中不需要的项,如Auto Simulation、Auto Sync Transforms.
19.如果你做的不是游戏,而是普通的app,去掉Android Game选项。
20.Hierarchy中的物体层级不要太多。
21.将多个操作能合并的合并。
比如,用Transform.SetPositionAndRotation代替Transform.SetPosition、Transform.SetRotation,用GameObject.Instantiate(prefab, parent, position, rotation)代替GameObject.Instantiate(prefab)、Transform.SetParent、Transform.SetPosition、Transform.SetRotation。
22.关闭Vsysc(Project Settings > Quality)
23.正确导入Texture(messh类似)
A.降低Max Size
B.图片尺寸为2的整数次方
C.使用图集
D.关闭可读写选项
E.关闭不必要的Mip Maps
F.使用纹理压缩,iOS和Android一般为ATSC
24.静止不动的物体勾选在static
25.少使用动态光源
26.关闭阴影
27.在移动物体中使用Light Probes
28.使用LOD(Level of Detail)
29.使用Occlusion Culling遮挡剔除
30.可以不使用移动设备默认分辨率,可使用Screen.SetResolution(width, height, false)降低分辨率来提升性能。
31.相机数量不能太多
32.尽量使用简单的shader,或者尽可能简化shader。
33.尽量不用透明材质
34.当需要在代码获取材质时,使用Renderer.sharedMaterial 而不是Renderer.material。Renderer.material将复制一份材质对象。
35.考虑到发热和电池续航能力,选择适当帧率(Application.targetFrameRate),Unity移动端的默认帧率为30fps。
36.将复杂UI拆分到多个Canvas中,将动静UI元素放在不同的Canvas中。
37.关闭(disable)看不见的UI元素。例如有的UI被弹出的UI遮挡了。
38.如果Canvas只是显示不需要交互,请去掉GraphicRaycaster组件。
39.如果一个UI元素不需要交互,将不要勾选Raycast Target
40.尽量不用Layout Groups,可能自己写代码控制。
41.避免使用大的列表或Grid views。
42.Canvas尽量使用Screen Space – Overlay 模式。
参考资料()