最近在做语音实时对话模块,不用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和内存占用过大,手机端还是强退。