Unity优化相关总结(内存)

内存是游戏中比较重要的一项,如果没有做好内存的管理,游戏可能会出现卡顿甚至闪退的现象。

Unity中的内存开销大致可以分为三类:1.资源内存占用  2.引擎自身内存占用  3.托管堆内存占用

其中资源内存占用可参考上篇Unity优化相关总结(资源),引擎自身内存占用了解不是很深,还需要进一步学习,

今天主要来说一下托管堆内存。

一.托管堆内存(Mono内存)

基于Unity开发而言,托管堆内存也可以认为是Mono内存,托管堆内存是由Mono分配和管理的。

托管的本意是Mono可以自动地改变堆的大小来适应所需要的内存。

但是这里有一点需要注意:虽然Mono会自动的改变堆内存大小,但是在代码中也不可以随意的开辟托管堆内存。

因为在Unity中,Mono的堆内存一旦被分配,就不会返还给系统,也就是说,Mono的堆内存会只升不降。

二.Mono内存管理策略

Mono的内存分为两个部分,已用内存+保留内存

Mono通过垃圾回收机制(GC)对内存进行管理

Mono中的GC主要有以下几个步骤

1.停止所有需要Mono内存分配的线程

2.遍历所有已用内存,找到那些不需要使用的内存(通过引用方式进行判断),并进行标记

3.释放被标记的内存

4.重新开始被停止的线程

三.使用Mono内存中存在的问题

1.Mono内存分配过大

在程序运行过程中,我们应该避免分配不必要的Mono堆内存

1.避免在Update、FixedUpdate或者高频率使用的函数中开辟堆内存(如 new Class /Array等)

2.避免在Update、FixedUpdate或者高频率使用的函数中使用GetComponent<>函数(单次使用不会有太多GC产生,但是数量级上来后会产生很多GC Alloc)

3.避免在Update、FixedUpdate或者高频率使用的函数中使用obj.name的操作(原因同上)

4.避免在Update、FixedUpdate或者高频率使用的函数中进行字符串操作,使用stringBuilder代替String

5.避免在Update、FixedUpdate或者高频率使用的函数中使用foreach函数

6.尽量不使用OnGUI函数,GUI.repaint也会产生一定数量的GC Alloc

7.Log输出需要进行自己的封装管理,打包的时候关闭Log输出

8.配置表的管理,有效的管理项目的配置表,可以节约可观的堆内存

2.Mono内存泄漏

Mono内存泄漏就是已经不被需要的对象没有被GC回收。

Mono内存泄漏会使空闲内存减少,GC频繁,Mono堆内存不断的扩充,最终导致游戏内存占用升高。

针对于Mono内存泄漏,就需要好好的对代码进行排查了。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值