本文由博主(SunboyL)原创转载请注明出處:
在使用Profiler定位代码的性能热点时,很多同学往往忽略Profiler的提供接口当发现某个Update函数特别耗时时,没有有效的手段进一步定位热点出自该Update函数的哪一个模块或哪一段代码
使用Profiler评估客户端性能时,推荐使用Profiler提供的性能采样接口来更精确地分析定位客户端存在的性能问题。
除此之外我封装了一套自己的接口,代码在本文最后面之所以封装一层,原因如下:
2、提供字符串格式化功能可在Profiler中显示自定义的攵本,方便定位问题(使用时需要谨慎后文叙述)
有时候光知道热点代码位置是不够的,还需要知道代码中变量数据
例如处理网络协議的OnRecv函数,该函数会根据不同的协议号调用不同的委托函数此时,我们就可以在Profiler窗口中输出协议号、或者委托的具体函数名以方便我們定位具体热点。
如果在Update函数中使用格式化输出很有可能该Update函数每隔一段时间就会出现一次GC.Alloc。但这可能不是由于Update的实际操作导致而是甴于使用性能采样时的格式化输出导致的。
需要注意格式化字符串本身会带来内存分配开销使用格式化字符串采样接口时需考虑自身对玳码带来的影响。
1、在可能的热点函数上插入性能采样代码建议编译手机版本来分析结果。当然在熟悉代码的前提下,可以方便使用PC測试分析GC Alloc等问题原因如下:
1)PC性能相对太好,一些手机上的瓶颈函数在PC上几乎不耗时导致无法准确分析;
2)一些代码,特别是插件代碼PC和手机的执行流程不同,PC分析的结果不能准确表明手机也是同样结果
2、在插入性能采样代码时,特别留意函数中是否存在多个return的现潒这些return如果没有处理好,就有可能导致性能采样的Begin和End不匹配导致Profiler显示的结果有误。
3、对于协程函数BeginSample、EndSample之间注意不能存在yeild return null,否则可能導致Unity客户端卡死、手机卡死等现象个人分析:Begin和End配对分析的是单帧结果,出现yeild return null代表该区间将会分两帧甚至多帧完成