降低GC:
1.使用对象池
2.string和StringBuilder的使用
3.减少装箱操作
4.关键帧限制协程调用(startcoroutine()实际上是new一个对象)
5.用for代替foreach(5.5版本以前有装箱操作,会在堆内存上产生一个system.object)
6.struct中不要有引用类型变量(struct是值类型,而如果struct中有引用类型的变量,GC会检查整个struct)【增加GC的方式是让它检查不必检查的对象】
7.主动调用GC
补充:
unity中采用的GC模型是贝姆垃圾回收模型。这意味着该程序会暂停执行过程,释放分配内存,在完成时继续。暂停时间的长短取决于需要解除分配的内存量。
因此,对于需要实时动作或移动的项目,如果该过程发生在游戏期间,这些卡顿会让玩家觉得游戏有延迟。
垃圾回收造成的性能问题特点是,游戏在大多数情况下会流畅的运行,但是会有间歇性中断或者卡顿,这类情况成为GC峰值。
通过使用增量式垃圾回收,使用相同的回收模型,但不会同时处理所有的GC过程,把操作分配到多个帧。尽管增量式垃圾回收会产生少量的开销,但有效的GC时间是相同的,这意味这些操作对玩家不太明显,实现更加流畅的游戏体验。
贝姆垃圾回收:无分代/并行,执行时所有线程阻塞,每次标记可达对象(穷举搜索垃圾)这种方式在短时间内造成帧率下降。
降低DC(drawcall,cpu传给gpu过程):
1.canvas分层,动静分离
2.图集合并
3.网格合批
4.蒙皮合批
5.LOD(level of detail)