一、功能研发背景
随着大家研发项目的复杂度逐渐增高,我们发现越来越多的项目开始将一些与Unity API无关的操作放到子线程中进行处理,比如文件的读取、解压和解密等操作,网络信息的收发操作,甚至一些自定义功能的逻辑操作等。这样做的好处显而易见,即:降低主线程的压力,同时提升项目的运行帧率。但是,它却给大家在堆内存分析时带来了新的“麻烦”—Mono的总体堆内存占用很高,但我们之前的性能报告或者Unity Profiler中却无法看到是哪个函数分配出来的。这是因为,子线程中的堆内存分配是抓取不到的。
二、实例说明
通常,如果在脚本中进行了堆内存分配,在Unity Profiler中可以在对应帧看到具体的分配大小。如下图中的代码,及对应的调用帧的信息。
然而,如果是在子线程中进行该操作,其所分配的堆内存在目前的Unity Profiler中则不会有显示。如下图中的代码,及对应的调用帧的信息。
可以看到对应的调用帧分配仅为276B,而堆内存的使用值在该帧前后,却增加了1MB,见下图。
以上这种情况是我们在研发团队中经常碰到的,对此,我们这几个月来对多线程的堆内存分配操作进行大量的试验和研究,并终于可以在今天向大家推出该功能。
三、子线程Mono堆内存分析功能
在最新的UWA线上性能测评的Mono堆内存分析功能中,对于在子线程中存在逻辑操作并产生堆内存的项目,可以在测评报告的“具体堆内存分配”页面中看到前缀为“Thread”的函数,这表示这些函数是在“非主线程”中被调用并且进行了堆内存分配,点击某一函数后,即可看到该函数的堆内存分配细节,下图则为上述子线程调用代码的堆内存分配统计。
同时,如果这部分堆内存被引用而无法通过GC释放时,还可以在“堆内存泄漏分析”面板的对应函数中看到这部分堆内存增长情况,如下图所示。
点击右侧的蓝色按钮后,即可看到对应的堆内存对象类型,及其堆内存分配大小和数量。
以上新功能目前仅在UWA线上测评版本中提供,欢迎大家的项目来体验。同时,我们后续会将其集成到本地性能测评工具UWA GOT中,敬请期待!
关于UWA的Mono堆内存分析功能,戳这里可以了解更多信息。
我不会告诉你堆内存泄漏可以自行搞定,不求人!
原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。