在上一篇博客中,我分享了一篇对u3d的gc机制详细介绍的文章,下面是我的个人总结。
第一步:了解u3d的内存分配管理。
u3d有栈区和堆区。
栈区:存放较小、短暂的数据片段。跟一般stack般进行简单扩展和移除。
堆区:存放较大、较久的数据片段,和部分较小、短暂的数据片段。
申请内存时:
1、首先查看是否有闲置的内存(否->2)
2、释放(GC)不需要的内存,再次查看内存是否足够(否->3)
3、申请新的内存空间
第二步:GC机制。即用来回收不必要的内存,供再次使用。
调用GC的3种情况:1、内存不足;2、系统定时调用;3、手动调用(System.GC.Collect())
GC的步骤:
1、检查每一个对象;
2、检索当前对象的每个引用是否可以删除;
3、标记可以删除的对象;
4、删除被标记对象,回收内存。
GC的缺点:
1、内存碎片化,可能导致反复的GC,占用更大的内存;
2、帧率运行低。
第三步:避免GC的缺点。
3种指向:
1、减少GC的时间;2、减少GC的频率;3、在非敏感期主动GC。
3种策略:
1、减少堆分配和对象引用;2、减少申请内存频率;3、尝试控制GC和堆扩展的时间。
技巧和注意点:
1、缓存;2、反复调用的函数上不要进行堆内存分配(如:update());3、对象池;4、清除链表;(clear()使得链表复用)5、字符串(分组件(text分为不变部分和变化部分,不变部分分为一个组件)、stringBuilder、Debug.Log());6、使用compareTag;7、避免装箱操作(装箱操作会导致堆区中创建了一个System.Object的引用来存放该值类型的变量);8、协程(yield return null、new WaitForSeconds(1f)写成一个delay);9、结构体中包含string时,可写成数组。
第四步:profiler window可检测是否为GC导致游戏缓慢。