美文网首页VR圈程序员
Unity3d性能1:GC分析

Unity3d性能1:GC分析

作者: 老掌门CEO | 来源:发表于2017-08-29 23:41 被阅读363次

    这段时间看了一些针对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。

    相关文章

      网友评论

        本文标题:Unity3d性能1:GC分析

        本文链接:https://www.haomeiwen.com/subject/vnaadxtx.html