Unity垃圾回收(GC)
1.GC的作用:定期释放不再使用的内存空间。
注:C++不支持GC,需要手动管理内存,使用new()申请内存空间,使用完后通过delete()释放掉,但可能出现忘记释放或者指针丢失的情况。
2.Unity中GC流程:
1)检查内存中所有的对象
2)检查每个对象是否被其他对象引用
3)GC会将没有被引用的对象标记为可释放
4)释放所有被标记对象
3.Unity GC触发条件:
1)周期性触发,平台不同周期时间不同
2)使用new()分配空间,但是内存空间满了
3)手动使用System.GC.Collect(),并非立刻执行
4.GC执行的问题:
1)每次执行GC,都会暂停Unity主线程,因此游戏画面会停止渲染,造成卡顿与掉帧
2)执行GC若内存仍然不足,会申请更大内存空间,造成更长时间卡顿
3)Unity的GC采取不压缩(内存块不会从离散变连续)的机制,可能导致内存碎片化
5.避免GC导致性能问题的解决方案:
1)谨慎使用new(),并且避免在Update等周期函数中使用,array,class等分配在堆上
2)使用struct代替class,因为struct分配在栈上
3)多使用对象池与Cache(缓存)
6.造成GC的C#语法
1)可以使用StringBuilder代替string
2)yield与async(异步)
3)装箱(变量转化为object类型)与拆箱(变量转为基本类型),可以使用.ToString()使得代码编译减少装箱操作,从而减少堆上内存分配。
4)闭包