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

一、功能研发背景

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


二、实例说明

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

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

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

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


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

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

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

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

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

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






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值