UWA 新功能| 多线程模式下也能定位堆内存问题了!

UWA 新功能| 多线程模式下也能定位堆内存问题了!

UWA 线上性能评测又推出新功能啦,Mono堆内存分析支持多线程统计!今天,我们在介绍该功能的使用方法之前,将详述其研发背景,即我们为什么要研发该功能,并通过实例结果加以说明,希望能加深大家对引擎的理解。


一、功能研发背景

随着大家研发项目的复杂度逐渐增高,我们发现越来越多的项目开始将一些与Unity API无关的操作放到子线程中进行处理,比如文件的读取、解压和解密等操作,网络信息的收发操作,甚至一些自定义功能的逻辑操作等。这样做的好处显而易见,即:降低主线程的压力,同时提升项目的运行帧率。但是,它却给大家在堆内存分析时带来了新的“麻烦”—Mono的总体堆内存占用很高,但我们之前的性能报告或者Unity Profiler中却无法看到是哪个函数分配出来的。这是因为,子线程中的堆内存分配是抓取不到的。


二、实例说明

通常,如果在脚本中进行了堆内存分配,在Unity Profiler中可以在对应帧看到具体的分配大小。如下图中的代码,及对应的调用帧的信息。
请输入图片描述
请输入图片描述

然而,如果是在子线程中进行该操作,其所分配的堆内存在目前的Unity Profiler中则不会有显示。如下图中的代码,及对应的调用帧的信息。
请输入图片描述
请输入图片描述

可以看到对应的调用帧分配仅为276B,而堆内存的使用值在该帧前后,却增加了1MB,见下图。
请输入图片描述

以上这种情况是我们在研发团队中经常碰到的,对此,我们这几个月来对多线程的堆内存分配操作进行大量的试验和研究,并终于可以在今天向大家推出该功能。


三、子线程Mono堆内存分析功能

在最新的UWA线上性能测评的Mono堆内存分析功能中,对于在子线程中存在逻辑操作并产生堆内存的项目,可以在测评报告的“具体堆内存分配”页面中看到前缀为“Thread”的函数,这表示这些函数是在“非主线程”中被调用并且进行了堆内存分配,点击某一函数后,即可看到该函数的堆内存分配细节,下图则为上述子线程调用代码的堆内存分配统计。
请输入图片描述

同时,如果这部分堆内存被引用而无法通过GC释放时,还可以在“堆内存泄漏分析”面板的对应函数中看到这部分堆内存增长情况,如下图所示。
请输入图片描述
请输入图片描述

点击右侧的蓝色按钮后,即可看到对应的堆内存对象类型,及其堆内存分配大小和数量。
请输入图片描述

以上新功能目前仅在UWA线上测评版本中提供,欢迎大家的项目来体验。同时,我们后续会将其集成到本地性能测评工具UWA GOT中,敬请期待!

关于UWA的Mono堆内存分析功能,戳这里可以了解更多信息。
我不会告诉你堆内存泄漏可以自行搞定,不求人!


关于UWA

由侑虎科技开发的游戏/VR应用性能优化平台,目前提供 1)性能检测与优化 2)资源检测与分析 3)UWA GOT 三大工具。同时,我们也会为大家开发更省心的功能,希望通过它们可以减少开发者反复测试定位问题的时间,从而将更多的精力集中在项目开发和解决问题中。我们将以实力和态度诠释我们对性能优化的定义:解决你的性能问题,方为“优化”。