unity中使用Thread的坑

       最近在做语音实时对话模块,不用unity的网络机制,而用socket开线程分别来录音和播放。注意,我使用的是C#编程Thread线程而非unity专属的coroutine协程。在线程Thread的使用中遇到了一个特大问题,而且是必然性而非偶然性问题,让我调试的很痛苦,而且结果让我更让人崩溃。


1、getThreadContext failed


       这是最烦的问题,每次运行几十秒就会出现一个弹窗,然后就卡死了,只能结束进程退出,很气。然后我关闭杀毒软件,没有弹窗了,但是卡死还是必然的。还根据网上提示减少线程减少线程里的数据收发量,删除try-catch,取消服务器和客户端的线程通信,把子子线程改为子线程,用Debug测试了整个星期,最后竟然发现这个Debug才是最终bug!去掉Debug后顺利运行不卡死,难怪我的工作一开始没有出错,因为没有加Debug!

解决方法:

1、删除线程里所有会调用到的Debug代码,不要用unity的调试类!调用次数越多,离unity主线程越近,就越容易出错。我估计这是因为Debug类语句是在unity编辑器中相应,运行debug时需要切换到unity生命周期中,也就是切换到主线程。执行完毕回到子线程,可能刚好子线程又运行到这条语句,发生冲突就出错。这些都是个人猜测,总之,Thread中不要使用任何需要回到unity中执行的函数。



2、The game crashed


       这是寻找上一个问题发现的错误,有可能跟上一个问题一起出现。这是由于我在测试线程中只加入while(true){ ... },循环中只有一两句赋值代码,因为循环太快就出错了。估计是协程里无法承受这样短周期内对少数指令频繁操作。也是离主线程越近就越容易报错。

解决办法:

1、在循环体里开头或末尾加Thread.Sleep(100)进行延时。

2、增加循环体里的操作时长,比如增加计算强度,增加操作流程,增加调用。


待解决问题:cpu和内存占用过大,手机端还是强退。



  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haobaworenle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值