Unity3d性能1:GC分析

这段时间看了一些针对GC的文章,感觉应该整理一下。首先分析一个课题需要明确该课题的意义,定义,结论。通过本文阅读,可以解答如下问题:


1 GC是什么?

2 GC是如何产生的?

3 GC给u3d应用带来了什么问题?

4 在u3d中如何定位这些GC问题?

5 如何在u3d中解决GC带来的问题


1 GC是什么?

GC是.net框架中用来自动管理内存的机制。针对u3d来说,通常使用C#来编写。C#中存在值类型与引用类型,值类型存储在栈上,引用类型存储在托管堆上,对于栈上面的数值,一般是生命周期较短数据较小的,所以栈内存的管理无需理会,mono会自动的解决。那么剩下堆内存的管理,这就用到了GC。堆内存上面一般存储数据大而且生命周期不确定的数据,应用程序使用过程中需要不断的在堆内存上分配空间供新变量使用,当空间不足时,GC会调用,首先会查找堆内存上哪些对象已经不被应用或者其他对象调用了,然后把这些对象标记下来,再删除这些对象,这样就有了新的空间来分配,这就是GC的原理。


2 为什么会出现GC呢?

当我们明白了GC的原理之后,这个问题变得简单了。

1)当应用分配空间时,如果空间不足就会出现GC。

2)系统自动调用GC,不同平台频率不同。

3)GC强制调用,手动调用。


3 Mono的GC会给我们带来什么问题呢?

1)GC的时间问题: 如果堆内存上变量/引用/对象太多,GC执行的时候需要去遍历所有对象,检查该对象是否被用,导致GC缓慢,性能低下,应用卡顿迟缓。

2)内存碎片化严重:如果堆内存上空间碎片化严重,各个变量对象之间存在间隙,会导致应用无法分配大块的空间供较大的变量使用,此时系统会让GC频繁执行,或者让堆空间不断重新分配,导致性能低下。其实对内存碎片化严重是由于GC不断的执行导致的,当GC执行的时候,清理掉变量空出来的空间不会进行重组合并,导致可用变量之间存在间隙空白,这些空白虽然组合起来够用,但是它不会组合。


4 如何在u3d中定位GC问题?

在profiler window中CPU usage栏中的GC alloc选项就代表了每一项GC清理的垃圾,可以定位到具体的函数。


5 如何解决GC带来的问题?

本篇文章先讲解策略,下篇文章继续讲解常见问题。

方向上来讲,

1 GC时间的降低,

2 GC调用频率的降低,

3 GC延迟时间降低

4 尽量少的产生垃圾

5 场景加载的时候或者没有玩家操作的时候,手动执行GC。

推荐阅读更多精彩内容