项目中, 我们使用Unity3D做客户端开发. 自己撸了一套C#网络库, 随着项目的推进, 问题来了:
问题
每次Unity3D编辑器打开时, 连接服务器都会有一定几率失败, 需要反复关闭再打开编辑器3~4次后, 才能正常接收到封包
转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy
探索
我们的网络库基于C#的Begin/End系的异步Socket, 这种socket更接近C++的asio模型, 撸起来特爽.
1. 根据经验, 这个诡异问题多半跟多线程有关系. 复查代码, 无效.
2. 找友人更换网络库, 换阻塞Socket实现和SocketAsyncEventArgs这种实现都试过, 仍然无法解决问题.
3. 接下来还是对Begin/End系的网络库进行日志追踪. 发现, 发送会总是成功, 连接成功和接收封包有一定几率会断掉
我们并没有单独开线程来处理, 而是利用底层异步通知, 然后有线程安全队列切换到主线程进行投递. 因此底层的线程正常性是整个问题的焦点
由于一直无法找到原因, 这个问题搁置了
转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy
解决方案
直到有一个偶然的机会, 取过同事代码后. 突然发现第一次打开Unity3D编辑器可以直接登录. 但之后又不行. 同事提醒, 会不会是优先度问题.
马上打开Edit->Project Settings->Script Execution Orders. 提高了网络组建优先度
测试, 通过, 问题解决
转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy
总结
转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy
一直怀疑这个问题跟Mono版本过老有关系, 但由于5.2版本到年底才更新, 之前只能自己啃bug.
在这个问题发生后解决前, 我们还有一个相关见闻: 我们将网络部分比较稳定的代码拆分放到dll中, 通过Unity3D的机制进行加载
结果, 网络无法初始化. 估计也是跟这个问题有关系
总之, 有类似问题时, 可以试用脚本执行顺序大法进行尝试