网易首页 > 网易号 > 正文 申请入驻

【厚积薄发】子线程GC导致主线程函数耗时较高的问题

0
分享至

这是第274篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com

UWA QQ群2:793972859(原群已满员)

本期目录:

  • 子线程GC导致主线程函数耗时较高的问题
  • 升级Unity大版本后,Text颜色修改问题
  • 清除增量式GC导致的Mono堆内存泄漏问题
  • 多Pass合批优化问题

Rendering

Q:在主线程中有非常多的卡顿,从UWA的报告中看到很多异常的高耗时,请问可能是什么原因造成的?

A:像上面这样的频繁卡顿,且卡顿函数种类非常多的情况,应该是子线程分配了非常多的堆内存,导致子线程GC,从而卡住了主线程。当GC的时候,主线程可能会处于各种阶段,因此对应阶段的函数耗时就会包括等待GC的耗时。可以从UWA的Mono报告中查看是否有子线程分配了大量的堆内存,通常是由这种(Thread)打头的子线程函数的分配导致的。

感谢han@UWA问答社区提供了回答欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6180e0f28f8c834241fd6930

UGUI

Q:从Unity 4.6.9f1升级到Unity 2020.3.2.f1c1。首次Unity升级之后UI的Text颜色修改是正常。当运行一次之后,所有的Text颜色都无法修改了。就算新创建一个新的Text也无法修改。

A:会有多余的UI-Default和UI-DefaultFont这两个Shader,删除它们,然后重启Unity就好了。

感谢芝麻青豆角@UWA问答社区提供了回答欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6185085fd8413e18eb034520

Mono

Q:最近在研究Mono堆内存时,发现一帧内分配多次较大内存,会导致内存无法被回收。

过程如下:

在同一帧内调用三次分配100MB内存的方法,分配内存的变量都是在各自的作用域,在这之后调用GC.Collect()。发现有较大几率出现100MB或者200MB无法被回收的Mono堆内存。经过排查之后发现取消勾选Incremental GC之后,内存就能完全被收回。

我推测是每次申请内存的时候会执行一次GC,清除上一次分配的内存,但是由于使用增量GC,无法在本帧完成回收工作。再下一次GC的时候,第二次GC的回收内容被重置了,导致第二次的GC需要被回收的内存就泄漏了。

不知道我这么理解是不是对的,希望大佬们解惑。同时希望大佬告知有没有办法清除这部分内存。

测试环境:

Unity 2019.4.15c1

Unity 2020.4.15f2

测试平台:

安卓 Mono

以下为测试代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Profiling;

public class TestMonoMemory : MonoBehaviour
{
void Do()
{
CallBack01();
CallBack02();
CallBack03();
}

public void CallBack01()
{
List i = new List(1024 * 1024 * 100 / 4);
//CallBack02();
}

public void CallBack02()
{
List i = new List(1024 * 1024 * 100 / 4);
//CallBack03();
}

public void CallBack03()
{
List i = new List(1024 * 1024 * 100 / 4);
}

public string text;

private void OnGUI()
{
GUILayout.Label("Allocated Mono heap size :" + Profiler.GetMonoHeapSizeLong() / (1024 * 1024) + "MB");
GUILayout.Label("Mono used size :" + Profiler.GetMonoUsedSizeLong() / (1024 * 1024) + "MB");

GUILayout.Label("Total Reserved memory by Unity: " + Profiler.GetTotalReservedMemoryLong() / (1024 * 1024) + "MB");
GUILayout.Label("- Allocated memory by Unity: " + Profiler.GetTotalAllocatedMemoryLong() / (1024 * 1024) + "MB");
GUILayout.Label("- Reserved but not allocated: " + Profiler.GetTotalUnusedReservedMemoryLong() / (1024 * 1024) + "MB");

if (GUILayout.Button("DO"))
{
Do();
}

if (GUILayout.Button("DO1"))
{
CallBack01();
}

if (GUILayout.Button("DO2"))
{
CallBack02();
}

if (GUILayout.Button("DO3"))
{
CallBack03();
}

if (GUILayout.Button("GC"))
{
System.GC.Collect();
}
}
}

A:通过题主的方法,我也复现了该问题。我还是比较赞同你的理解的。

Unity官网的一篇关于增量GC的博客也写了该方法的弊端:

它的正常运行是需要前提的,那就是在GC期间这些被标记为“需要清理的内存”都保持不变。如果在GC期间变化了,比如频繁分配大量内存,那么就需要重新标记一遍,而这个阶段可能会有意想不到的bug产生。内存泄漏很可能就是发生在这个阶段(我也只是猜测)。

不过个人觉得增量GC仍然是一个良好的尝试,虽然它只是测试阶段,也存在着一些问题,但是以前的Boehm-Demers-Weiser garbage collector很容易引起高耗时峰值从而造成卡顿,而分代式GC正是为了减轻峰值的影响,尽量确保流畅性。

可以参考官方博客:

https://blog.unity.com/technology/feature-preview-incremental-garbage-collection

该回答由UWA提供欢迎大家转至社区交流:

https://answer.uwa4d.com/question/61658ad48f8c834241d92a0b

Rendering

Q:游戏使用简单的Mesh显示几十张扑克牌,为了效果,材质Shader使用了2个Pass,其中一个是拉伸做边缘效果,但是由于是多Pass,即使是相同的材质和贴图,还是不能动态合批,请教这种情况有没有什么优化方案?

1. 不能合批,但是材质是相同的,顺序渲染过程中是否有什么状态切换的消耗?

2. 能否使用两个Mesh,不同的材质,Shader都使用单Pass,区别是一个Mesh是正常显示,一个Mesh仅仅做拉伸边缘效果,理论上是不是不超过顶点数的情况下可以两次动态合批?

A1:Unity BuiltIn渲染管线不支持多Pass合批,多Pass的Shader通过Set Pass call逐个渲染每个Pass后才会继续渲染下一个Object重复一遍,所以会产生比较多的Draw Call。

更好的办法就是用自定义的渲染管线的方式渲染多个Pass。在渲染第一个Pass的时候,把所有的Object一次性全都渲染了,渲染完毕之后通过一次Set Pass Call去渲染下个Pass,可以试下URP渲染管线。

感谢星傲蝶恋@UWA问答社区提供了回答

A2:题主说的第二点是比较常规的做法,要注意的是为了防止Draw Call的穿插,需要调整这两种渲染的RenderQueue,将他们对应的RenderQueue错开。

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6178c9c58f8c834241f2aaeb

20211108

更多精彩问题等你回答~

  1. Unity增量打包AssetBundle没变化的资源也会被重新打包

    https://answer.uwa4d.com/question/615538998f8c834241c3dbdd

  2. 在模型有UV2的情况下开启Generate Lightmap UVs

    https://answer.uwa4d.com/question/614458df8f8c834241ac1183

  3. 如何实现AAB包的增量更新

    https://answer.uwa4d.com/question/60e80c26038436106ddf44da

封面图来源于网络

今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com

官方技术博客:blog.uwa4d.com

官方问答社区:answer.uwa4d.com

UWA学堂:edu.uwa4d.com

官方技术QQ群:793972859(原群已满员)

点击下方名片关注我们,将我设为星标,及时接收小编每日推送哦,性能优化不迷路~


近期精彩回顾

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
字节跳动廉洁通报:一名外包员工耗时18个月,长期批量盗取公司茶水间免费零食、饮料对外倒卖牟利,累计获利超万元,该员工已被开除拉黑

字节跳动廉洁通报:一名外包员工耗时18个月,长期批量盗取公司茶水间免费零食、饮料对外倒卖牟利,累计获利超万元,该员工已被开除拉黑

鲁中晨报
2026-07-09 15:50:11
怀特塞德事件尘埃落定!中国反兴奋剂中心公布了违例动态!

怀特塞德事件尘埃落定!中国反兴奋剂中心公布了违例动态!

篮球资讯达人
2026-07-10 18:47:54
国足利好!世界杯或扩军64队 亚足联获11席 韩媒:中国队有望出线

国足利好!世界杯或扩军64队 亚足联获11席 韩媒:中国队有望出线

念洲
2026-07-10 16:12:21
长沙一女公务员霸占他人车位八天,留假号码、谎称出差、拒绝道歉,当地体育局最新通报:将根据调查结果依法依规处理并及时公布

长沙一女公务员霸占他人车位八天,留假号码、谎称出差、拒绝道歉,当地体育局最新通报:将根据调查结果依法依规处理并及时公布

极目新闻
2026-07-10 13:59:19
凌晨3点 世界杯双红会!3大超级核心对决 胜者进4强决战法国

凌晨3点 世界杯双红会!3大超级核心对决 胜者进4强决战法国

叶青足球世界
2026-07-10 15:33:08
安徽省纪委监委通报:吴永彬被查

安徽省纪委监委通报:吴永彬被查

上观新闻
2026-07-10 18:44:41
伏明霞父亲追悼会,梁锦松一个动作让婚变谣言灰飞烟灭

伏明霞父亲追悼会,梁锦松一个动作让婚变谣言灰飞烟灭

草莓解说体育
2026-07-10 17:17:01
“我对他没有一点母爱了!”妈妈直言厌恶3岁儿子,网友一反常态

“我对他没有一点母爱了!”妈妈直言厌恶3岁儿子,网友一反常态

妍妍教育日记
2026-07-10 08:45:08
震惊!美国逮捕12名涉嫌卖淫中国籍女性,年龄36至67岁,外貌成为舆论焦点

震惊!美国逮捕12名涉嫌卖淫中国籍女性,年龄36至67岁,外貌成为舆论焦点

火山詩话
2026-07-10 08:57:13
那年,杨超越还是个厂妹,在厂里啃馒头

那年,杨超越还是个厂妹,在厂里啃馒头

微微热评
2026-07-08 23:03:27
气象专家:台风“巴威”本体不会直接影响北京,降雨有间歇期

气象专家:台风“巴威”本体不会直接影响北京,降雨有间歇期

新京报
2026-07-10 18:35:16
重大突破,又见大红屏!

重大突破,又见大红屏!

环球网资讯
2026-07-10 13:56:17
“有钱人不长你这样!”女孩晒天价矿泉水被嘲,家长认清现实!

“有钱人不长你这样!”女孩晒天价矿泉水被嘲,家长认清现实!

林林先生
2026-07-10 09:05:03
“飞行员举报情人诈骗700余万案”二审改判:刑期从12年减为6年,家属称将申诉

“飞行员举报情人诈骗700余万案”二审改判:刑期从12年减为6年,家属称将申诉

红星新闻
2026-07-10 18:31:31
A股:尾盘突然加速跳水,原因是这两点!下周历史即将重演?

A股:尾盘突然加速跳水,原因是这两点!下周历史即将重演?

明心
2026-07-10 16:01:59
福建晋江鞋厂火灾致28死,附近住户称自己4个家人是厂里员工已确认平安;村干部:留在厂内的工人是想多做一会儿,多赚点钱

福建晋江鞋厂火灾致28死,附近住户称自己4个家人是厂里员工已确认平安;村干部:留在厂内的工人是想多做一会儿,多赚点钱

大象新闻
2026-07-10 11:57:03
你的驾驶证上有“大拇指”就恭喜了!6大专属优待普通人不知道

你的驾驶证上有“大拇指”就恭喜了!6大专属优待普通人不知道

沙雕小琳琳
2026-07-10 17:03:58
“辞职看世界”的女老师,11年后现状曝光:黯然回乡,老公已离婚

“辞职看世界”的女老师,11年后现状曝光:黯然回乡,老公已离婚

知法而形
2026-07-10 00:30:44
非必要不做肠镜?医生:只要做过肠镜,患者一定多加关注这4点!

非必要不做肠镜?医生:只要做过肠镜,患者一定多加关注这4点!

芹姐说生活
2026-07-09 23:13:04
雷军公布小米澎程N90完整外观设计 这颜值你打几分?

雷军公布小米澎程N90完整外观设计 这颜值你打几分?

CNMO科技
2026-07-10 12:36:11
2026-07-10 20:16:49
侑虎科技UWA incentive-icons
侑虎科技UWA
游戏/VR性能优化平台
1596文章数 987关注度
往期回顾 全部

科技要闻

中国开启可回收火箭时代

头条要闻

609分钟零失球刷新36年纪录 美加墨世界杯门将创历史

头条要闻

609分钟零失球刷新36年纪录 美加墨世界杯门将创历史

体育要闻

法国VS摩洛哥:谁才是臭外地的?

娱乐要闻

韩国顶流李钟硕与IU官宣分手!

财经要闻

一封举报信 引发小红书IPO合规考验

汽车要闻

是谁在古法造车?吉利全新燃油家轿定名星瑞L PLUS

态度原创

时尚
家居
亲子
房产
本地

起初,人们以为AI代替演员是句玩笑话

家居要闻

2026建博会(广州) 公装联探展交流活动

亲子要闻

我啥时候才能有中国户口?

房产要闻

重磅学校规划曝光!西海岸教育,正强得可怕!

本地新闻

重庆人有自己的避暑桃花源 | 夏天就去「酉」风的地方!

无障碍浏览 进入关怀版