首页 > 技术文章 > 帧分析工具

zhuangdaren 2017-07-02 14:17 原文

对于音游来说,一场对局如果有卡顿的话,可能会直接影响到比赛成绩,本来可以拿第一名的,结果因为卡顿掉到了第二名,甚至更低名次。卡顿对于音游,MOBA等很多类型来讲,都是很影响体验的,甚至是很致命的,因为这直接关乎留存率。其中gc是最常见、最普通的卡顿,也是比较难搞的。由于unity-mono目前还是使用的保守式垃圾回收算法,所以每次gc都是stw方式,动辄200ms以上,一帧150ms就已经有很明显的卡顿。解决gc的思路是尽量避免局内临时分配内存,但是一个复杂的对局,它的游戏逻辑,用到的模块也是相当庞杂的,很难做到完全不分配内存,所以只能砍掉问题比较大且比较好弄的部分,这样才能做到有的放矢,提升优化效率。但是unity的profiler工具只能显示299帧的数据,而且这个数据还不能保存,也就是说如果用unity自带的profiler工具来搞gc问题,只会把自己局限在对某帧的分析上,gc问题是内存分配问题,内存分配是一个叠加的过程,需要从一个宏观的角度去分析解决这个问题,最直白的,就是需要拿到整场对局的内存分配数据。unity asset store上倒是有类似的工具,不过感觉都不够定制化,且收费过高,都在25美元以上,感觉很不值。我自己写了个帧分析工具,配合插桩,可以将整场对局的帧profiler数据保存下来,有了这个数据,就能对各种问题做统计了。我做了一些实用性的功能:统计各项栈顶内存分配总计,统计调用栈中每项内存分配总计,统计gc触发次数,已经在哪几帧出现的,等等。下面列下一些UI:

工具功能窗口:

gc统计:

alloc统计(overview):

alloc统计2(调用栈):

通过使用这个工具来做profiler,在给公司的项目优化里面,做到了全程无gc。有喜欢的朋友可留言,我会讲讲我的优化经验和工具使用方法。

推荐阅读