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的主要内容,如果未能解决你的问题,请参考以下文章