Unity GC优化整理
参考:
Unity优化之GC——合理优化Unity的GC:https://www.cnblogs.com/zblade/p/6445578.html
Unity GC 优化要点:https://www.cnblogs.com/u3ddjw/p/8624438.html
C# 入门(2) 预定义类型、用户定义类型、值类型和引用类型、可空类型:https://blog.csdn.net/l773575310/article/details/71082347
【Unity】中GC优化XLua下的各种值类型:https://blog.csdn.net/swj524152416/article/details/55511070
Unity中xLua与toLua对Vector3的优化:https://www.jianshu.com/p/07dc38e85923
C#技术漫谈之垃圾回收机制(GC):https://www.zhihu.com/search?type=content&q=c%23 gc 原理
Unity3D研究院之字符串拼接0GC(一百零四):http://www.xuanyusong.com/archives/4601
引用类型会产生GC
参数数组产生GC
// 数组(包括变长参数数组 params)会产生GC:
// Mathf库举例
public static int Min(params int[] values);
public static int Min(int a, int b);
// 如果调用是两个参数的Min方法,不会产生GC
Mathf.Min(1,2); // 不产生GC
// 否则直接赋值整形会合成数组
Mathf.Min(3); // 相当于Mathf.Min(new int[]{3}),创建个数组,产生40字节,加上一个int4个字节
Mathf.Min(new int[]{3}); // 和上面等价
List.ToArray 产生GC
List<int> intList = new List<int>() {};
intList.ToArray(); // 产生40字节GC
Input.touches 遍历输入
var a = Input.touches; //产生80字节
// 遍历的话直接调其API就好了
int count = Input.touchCount;
for (int i = 0; i < count; i++)
{
var touch = Input.GetTouch(i);
}
参数为object的函数(会拆装箱)
// Vector3的一个比较方法:(5.6版本会有没有参数为Vector3的重载方法,下面是5.6版本会出现的GC情况)
public override bool Equals(object other);
Vector3 a, b;
a.Equals(b); // b 从Vector3 装箱成object,产生GC
a == b; // 代替上面,直接判断,不产生GC
字符串
- 字符串合并,转换等都会产生GC,用StringBuilder,组件固定字符拆分多个组件。
- 用插件zstring。
XLua优化
- Vector3等这种 struct 结构体 要传给lua,会new一块userdata,拷贝一份数据出来,产生GC,优化方法可以是参数改成传三个float。
- 自定义结构体改成class,就变成引用,不产生GC。
- 枚举类型传的时候也会产生GC,可以用整形来传,再做转换。
- 字符串,bytes,Unity和Lua互传就会产生GC,尽量避免。
Action (方法)
- 作为参数,会拷贝。不要每帧调用,可以先存起来。
性能优化
- 减少射线,如判断人物到地面高度,除了用射线,还可以用Terrain.SampleHeight来获取当前地形高度。
- 降低复杂函数调用频率。
- 频繁调用的变量先存起来。像
gameObject.transform
这种也要,在xLua会导出类似get_transform()
的函数,每帧调用还是挺耗时的。 - 打包的时候,屏蔽log。
- 对象赋值,先判断是否相等,相等直接返回。
- 少用协程。