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的截图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值