Unity GC 学习总结

GC优化
官方

Unity3D内存管理——对象池(Object Pool)

在讲这个例子之前,要明白什么被称之为垃圾,垃圾就是一个内存区域,没有被任何引用指向,或者不再会被用到。 哪么在第一次点击按钮的时候会生成4 个对象,第二次点击按钮的时候也会生成4 个对象,但是第一次生成的4 个对象就已经是垃圾了,因为,第一次生成的4 个对象随着 button1_Click 函数的结束而不会再被调用(或者说不能再被调用 ),哪么这个时候GC 就会来回收吗?不是的!我说了GC 是随机的,哪么你只管点你的,不一会GC 就会来回收的(这里我们可以认为,内存中存在一定数量的垃圾之后,GC 会来 ),要证明GC 来过我们把AA 类改成

1、C#变量分为两种类型:值类型和引用类型,值类型分配在栈区,引用类型分配在堆区,GC关注引用类型

2、GC卡顿原因:堆内存垃圾回收,向系统申请新的堆内存

3、GC触发条件:堆内存分配而当内存不足时、按频率自动触发、手动强行触发(一般用在场景切换)

4、GC负面效果:内存碎片(导致内存变大,GC触发更加频繁)、游戏顿卡

5、GC优化方向:减少GC次数、降低单次GC运行时间、场景切换时主动GC

6、GC优化策略:减少对内存分配次数和引用次数、降低堆内存分配和回收频率

7、善用缓存:对有堆内存分配的函数,缓存其调用结果,不要反复去调用

8、清除列表:而不要每次都去new一个新的列表

9、用对象池:必用

10、慎用串拼接:缓存、Text组件拆分、使用StringBuild、Debug.Log接口封装(打Conditional标签)

11、警惕Unity函数调用:GameObject.name、GameObject.tag、FindObjectsOfType()等众多函数都有堆内存分配,实测为准

12、避免装箱:慎用object形参、多用泛型版本(如List)等,这里的细节问题很多,实测为准

13、警惕协程:StartCoroutine有GC、yield return带返回值有GC、yield return new xxx有GC(最好自己做一套协程管理)

14、foreach:unity5.5之前版本有GC,使用for循环或者获取迭代器

15、减少引用:建立管理类统一管理,使用ID作为访问token

16、慎用LINQ:这东西最好不用,GC很高

17、结构体数组:如果结构体中含有引用类型变量,对结构体数组进行拆分,避免GC时遍历所有结构体成员

18、在游戏空闲(如场景切换时)强制执行GC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值