战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

项目中, 我们使用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. 提高了网络组建优先度

image

测试, 通过, 问题解决

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

总结

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

一直怀疑这个问题跟Mono版本过老有关系, 但由于5.2版本到年底才更新, 之前只能自己啃bug.

在这个问题发生后解决前, 我们还有一个相关见闻: 我们将网络部分比较稳定的代码拆分放到dll中, 通过Unity3D的机制进行加载

结果, 网络无法初始化. 估计也是跟这个问题有关系

总之, 有类似问题时, 可以试用脚本执行顺序大法进行尝试

posted on 2015-07-06 16:11 战魂小筑 阅读(3644) 评论(8)  编辑 收藏 引用 所属分类: 游戏开发技术Unity3D

评论

# re: 一个诡异的Unity3D的网络问题 2015-07-10 11:08 qiyun
开多线程无此问题  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2015-07-11 13:01 Ollydbg
之前我测试这个问题 是因为UnityVS插件 去掉这个插件就没这个问题了.  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2015-07-13 09:49 战魂小筑
@Ollydbg
但总不能不用吧, 按你这么说, 确实也是这个道理, 打包出来的没有这个问题  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2015-08-06 20:06 DRed
原来是这个问题,我之前用异步的收发包函数,会出现收不到包,或者发不出包的情况。查了很久都查不出原因,后来用开多线程的方式才解决了。。。  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2015-08-28 22:23 ilylia
@战魂小筑
我们也发现是UnityVS,但是无法解决,后来没管了……影响不大  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题[未登录] 2015-08-29 08:32 Lucifer
unity4.3,自己写的网络库没发现有这样的问题,跑的很欢  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2016-05-10 11:08 主席
Begin/End 这个你在IOS下测试过没有,我的在IOS下收不到包。请问您有遇到过吗  回复  更多评论
  

# re: 一个诡异的Unity3D的网络问题 2016-05-10 11:10 战魂小筑
@主席
建议Recv不要用Begin/End系, 否则偶尔会发不出包. iOS和PC都会出此问题  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理