为了能大幅度降低主线程的压力,提升项目的运行帧率,我们更倾向于将与 Unity API 无关的操作放到子线程中进行处理。但是,在分析堆内存占用时,由于无法获取子线程的堆内存分配具体情况,定位分析时就存在一定门槛。
为了解决这个问题,我们在优化利器GOT Online的 Mono 模式中支持了多线程统计,配合 GOT Online 本身灵活使用、随改随测的特性,帮助大家更加快速地提升性能。下面是该功能的详细介绍。
当我们使用子线程并在其中分配堆内存时,比如下图中的组件,在 Start 中开启了两个子线程,并间歇性地分配堆内存:
这种情况下,Unity 的 Profiler 中无法检测到这部分的 GC.Alloc,但这部分依然需要我们关注,本质上其与主线程上的 GC.Alloc 是相同的:频繁分配会导致 GC.Collect 的调用,引用释放不合理会导致堆内存泄漏。
现在,通过使用 GOT Online 的 Mono 模式进行测试,可以在测评报告的 “具体堆内存分配” 页面中看到前缀为 “Thread” 的函数,这表示这些函数是在 “非主线程” 中被调用并且进行了堆内存分配。点击某一函数后,即可看到该函数的堆内存分配细节,下图则为上述子线程调用代码的堆内存分配统计。
同时,如果这部分堆内存被引用而无法通过 GC 释放,可以在 “堆内存泄漏分析” 面板的对应函数中看到这部分堆内存增长情况,也可通过选中其中两节点进行比较,如下图所示。
点击右侧的蓝色按钮后,即可看到对应的堆内存对象类型,及其堆内存分配大小和数量。
说明:该功能目前支持 2.3.0 及以后版本的 SDK,建议大家在 UWA 官网下载最新版本,体验最完整的功能。
还不了解 GOT Online 这个黑科技?
一分钟了解它!
性能黑榜相关阅读
《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了 80% 的对手!》