1.
Camera ClearFlags 千万别选 DontClear
2.
代码中空的Update也是消耗性能的 应当清理掉
3.
在Update使用的东西,能缓存的尽量缓存,不要在Update出现诸如GetComponent的东西
4.
能够复用的东西使用类型池
实例化和销毁一个对象通常比停用和重新激活它要昂贵得多,如果对象包含启动代码,例如在Awake()或Start()函数中对GetComponent()的调用,则尤其如此。
5.
Transform , Transform.position是一个访问器,频繁使用是有消耗的,如果需要使用建议缓存
6.
vector3和vector3的平方根操作影响性能很大,建议将vector3.magnitude 替换成vector3.sqrMagnitude
7.
Camera.main 这看起来是一个变量,其实也是一个访问器,内部涉及到find,所以也应该缓存
8.
只有不运行的代码才是好代码,在摄像机看不到的地方,我们可以不执行显示相关或者其他不影响游戏的代码.
比如:
private Renderer myRenderer;
void Start()
{
myRenderer = GetComponent();
}
void Update()
{
UpdateTransformPosition();
if (myRenderer.isVisible)
{
UpateAnimations();
}
}
或者使用OnBecameInvisible()和OnBecameVisible()
9.
如果可以尽量使用struct 这种数值类型代替class
10.
数组结构的重用,建议建立一个 成员list,作为那些需要临时创建list的函数内部使用,这样可以有效减少GC.
11.
C#中的所有方法引用都是引用类型,因此在堆上分配。通过将方法引用作为参数传递,都会临时分配内存。不管传递的方法是匿名方法还是预定义方法,都会进行这种分配。
其次,将匿名方法转换为闭包将大大增加将闭包传递给接收闭包的方法所需的内存量。
闭包过程就是 引用匿名函数外部变量的过程.
12.
避免装箱和拆箱,就是,数值类型转换为引用类型,引用类型转换为数值类型
13.
字典和枚举.
通常,我们的 new Dictionary
在使用add,tryGetValue,remove 等等.
所以我们这么写可以避免装箱和拆箱操作
public enum MyEnum { a, b, c };
public class MyEnumComparer : IEqualityComparer
{
public bool Equals(MyEnum x, MyEnum y)
{
return x == y;
}
public int GetHashCode(MyEnum x)
{
return (int)x;
}
}
MyEnumComparer mycomper = new MyEnumComparer();
var myDictionary = new Dictionary(mycomper);
14.
访问unity自带数组结构时,需要提前提出,避免重复,因为你不知道这个类型到底是不是一个访问器还是什么.安全起见全部提出.
比如
//mesh.vertices将会不断的创建新的副本
for(int i = 0; i < mesh.vertices.Length; i++)
{
//修改成这样就好很多.
var vertices = mesh.vertices;
for(int i = 0; i < vertices.Length; i++)
{
15.
对于数组类型的返回时,尽量返回零长数组而不是null,避免之后有余数值为空造成的各种影响.
16.
需要携程等待一帧,最好使用 yield return null 代替 yield return 0, 因为0时数值类型会有装箱操作.
17.
结构体内如果包含引用类型,GC会检查整个机构体,所以,尽量的,结构体内不要包含引用类型.
18.
函数返回的类型最好使用数值类型.
19.
在使用一些需要传入字符串操作的时候其实可以先将字符串转换为ID
//优化前
material.SetColor("_MainColor",Color.White);
animator.SetTrigger("attack")
//优化后,重复使用
static readonly int material_Color = Shader.PropertyToID("_Color")
static readonly int anima_Attack= Animator.StringToHash("attack")
material.SetColor(material_Color ,Color.White);
animator.SetTrigger(anima_Attack)
20.
字符串比较
//性能羸弱的方式 1
string.Equals("a","a");
//性能羸弱的方式 2
String.Compare("a","a") == 0
//性能优越
myString.Equal(otherString,StringComparison.Ordinal)
//StringComparison的其他枚举定义
public enum StringComparison{
CurrentCulture,
CurrentCultureIgnoreCase,
InvariantCulture,
InvariantCultureIgnoreCase,
Ordinal,
OrdinalIgnoreCase
}
//CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。
//CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
//InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。
//InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。
//Ordinal 使用序号排序规则比较字符串。
//OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。
21.
将 vector3.zero 之类全部做成一个 const 或者 static readonly 将会大大提升效率
22.
遍历的时候,将count提出,可以减小访问,起到优化的作用
23.
内存紧密排布的结构,比如数组用for来遍历比较好,但是内存散乱的用,foreach比较好
24.
在使用RenderTexture的时候,如果你需要频繁的创建,那最好用GetTemporary 释放的时候ReleaseTemporary,unity内部会为我们维护一个内存池, 别忘了释放,不然内存无限叠加.