【U3D性能优化教程——Mono内存篇】之一:Mono与U3D关系&GC原理

 

 

 

本文由@唐三十胖子出品,转载请注明出处。  
文章链接:https://blog.csdn.net/iceSony/article/details/82988806

 

 

 

这篇文章由唐三胖ヾ(•ω•`)o网络整理总结,针对Mono概念的系列优化教程。

 

【U3D性能优化教程——Mono内存篇】之一:Mono与U3D关系&GC原理_第1张图片

通过这篇文章,你可以知道

1)Mono与U3D关系

2)GC原理

 

 

Mono与U3D关系

U3D开发脚本为C#或者Javascript或者第三者lua,首先我们要知道并不是所有平台都可以直接运行c#代码,这一点我们可以参考隔壁的Java。。。需要一个中间对象进行处理,将c#变成目标机器可运行的代码,所以Mono出现了,不仅处理了c#跨平台的问题,还提供Mono VM给你运行的环境。

游戏运行除了模型与图像渲染会消耗内存(这个不属于这篇文章讨论范畴),代码当然也会。既然管代码的老大是Mono,那么如何降低Mono代码就成为重中之重。要注意Mono的内存是在游戏开始运行的时候有默认大小的,会不断增加但是永远不会还给内存,是个永远吃不饱的胖子,我只能加不会减ヾ(•ω•`)o

注:手游的常见Mono memory<=50MB算合格

【U3D性能优化教程——Mono内存篇】之一:Mono与U3D关系&GC原理_第2张图片

3大脚本被编译成IL(中间语言,虚拟机可以识别),在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,运行在Mono VM虚拟机上

Mono处理这么多事情,我们能做什么进行优化呢?这就是我们接下来要说的GC(garbage collection)

GC原理:

在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。

【U3D性能优化教程——Mono内存篇】之一:Mono与U3D关系&GC原理_第3张图片

代码申请的内存为Mono内存,Mono空闲内存不够,先GC,还不够向系统强取豪夺

GC引发:

GC引起的性能问题可表现为帧率过低,帧率剧烈波动或者间歇性卡顿。但是其他问题也可能引起类似的症状。

内存管理:

unity内部有两个内存管理池:堆内存和栈内存。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。


哪些代码会产生GC呢?

理论上所有new(结构体除外)都会产生GC

TestScript t1 = new TestScript();//第一次new1

t1 = new TestScript();//第二次new2

这里t1是new对象,t1为new1的引用

而第二次new后,t1指向new2

那么new1此时无引用,则在下次gc回收


但有一种情况

TestScript t1 = new TestScript();

TestScript t2 = new TestScript();

t1.t = t2;

t2.t = t1;

t1 = null;

t2 = null;

这种情况t1虽然不引用,但new出对象仍然指向t2new出

则t1,t2则都不会回收,写代码要注意这种情况

 

定时执行GC操作:

引用越多,每次gc越慢

游戏中常在加载场景(一个Loading场景中清除缓存)

如果我们知道堆内存在被分配后并没有被使用,我们希望可以主动地调用GC操作,我们可以主动的调用GC操作:System.GC.Collect()

 

总结:

接下来我们从容易引发性能消耗的字符串,函数调用,常见的拆装箱,协程,结构体等方面优化GC

你可能感兴趣的:(U3D开发性能优化,【U3D性能优化教程】)