Unity记一次Profiler补捉到的gc alloc

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity记一次Profiler补捉到的gc alloc相关的知识,希望对你有一定的参考价值。

一直没注意,今天还真捕捉到了

如上图,只有上面的一帧有gc,之后几帧确实没有这个gc,只有这一帧

可以肯定第一个GC问题:

1.网上说的gc alloc就是做了一次垃圾回收,暂定是对的

再结合自己的代码和经验,希望确定下面几点

2.foreach 确实存在gc问题

3.追求0 gc 没必要,已有实践证明,付出代价太大,也没办法确认这个gc的频率是否对游戏的整个影响是不是那么大(如上图——)

4.两个gc,甚至多个gc会同时出现,这也比较合理,说明内存真的不够,要是够内存你真就观察不到了

是否可以定位gc来自哪段代码

其实也是可以的

而且定位后发现和Foreach没什么干系,网上又一接消息破灭

截图就不截了。。。。主要方法还是开启 Profiler的 DeepProfiling

我是如何修复gc的:

    private void Update()
    {
        foreach (var pro in process)
        {
            //pro.name 会有 gc,oh no!!!
            //Profiler.BeginSample(pro.name+"-"+pro.sampleType);
            Profiler.BeginSample(pro.sampleType);
            pro.BatchUpdate();
            Profiler.EndSample();
        }
    }

gameObject.name会有gc,这个需要反编译一下unity的代码才好解释

string 的拼接也会有gc,这就比较好解释,因为c#的变量string和int,float都不同,string是引用变量,你也可以理解为类(类也是引用变量),new 一个类时会有gc,则new 一个string时也不例外,所以很多c#老人说的string慎用,也是有其道理的

最终,修复后,没了gc的截图

以上是关于Unity记一次Profiler补捉到的gc alloc的主要内容,如果未能解决你的问题,请参考以下文章

记一次基于Unity的Profiler性能分析

Unity记一次Profiler连真机测试优化实践

Unity记一次TA的二次元风格渲染

分享Unity的Profiler分析和解决GC.MarkDependencies

Unity - Profiler参数详解

记一次Unity最新多人联网同步框架Mirror