Unity GC优化整理

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

Unity GC优化整理_第1张图片

参数数组产生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。
  • 对象赋值,先判断是否相等,相等直接返回。
  • 少用协程。

你可能感兴趣的:(C#)