ce吧 关注:196,098贴子:3,799,564

组包中断的原因分析和几种解决办法

只看楼主收藏回复



IP属地:河南1楼2016-06-22 02:40回复
    围观,前排遛打脸大神 @HellO丶Days


    IP属地:广东2楼2016-06-22 02:41
    收起回复
      围观前排打脸


      3楼2016-06-22 02:42
      回复
        不给15字!


        4楼2016-06-22 02:42
        回复
          关于组包中断的原因,现在有两种说法
          咱们不讨论那个对哪个错。我更倾向于第二种
          1:重复快速发包而又不走主线程,这时候会导致服务器没有处理完第一个包的情况下,你又发送了第二个封包,或者服务器正在处理主线程包的时候你发包,这时候就会被服务器踢下线,也就是网络链接中断。
          2:发包接口占用,也就是主线程发包动作未完成,然后你也来了一发,导致中断。具体原理参照Obj闪退。一个原理,不过一个是服务器,一个是内存分配。
          原因清楚了,接下来说解决办法。


          IP属地:河南5楼2016-06-22 02:43
          回复
            楼主 贴不贴那种,就是.....就是那种.......我没见过的“VB”嘛? 我想看大神撕你
            有请大神 @HellO丶Days


            IP属地:广东6楼2016-06-22 02:45
            收起回复
              发发,表偷懒我要凑齐15字,等着睡觉,


              8楼2016-06-22 02:50
              回复
                学学,看看


                IP属地:福建来自Android客户端9楼2016-06-22 02:52
                回复
                  1:这个办法并不能解决线程外部发包和主线程发包的冲突,但是能解决线程内部发包冲突。也就是说还有几率中断(网络较差的情况下),但是能基本上一条疲劳入包不中断。
                  具体实现:以入包为例子(本帖子所有功能以大家最容易中断的入包为例子)
                  首先看一下入包的流程 怪物死亡-》掉落物品-》向服务器发送拾取请求 -》 服务器收到请求 -》 处理 -》 服务器向本地发送拾取包 -》 本地执行拾取动作
                  中断出在 重复发送拾取请求,也就是服务器在没有处理完一个请求的情况下 又收到了一个请求。然后就踢你下线。
                  这里我们只讨论入包冲突,也就是如果入包的同时你有其他发包动作也是会导致中断的。
                  解决入包冲突只需要一个判定。
                  判定是否拾取成功。那么来写一下伪代码
                  for(遍历图内物品){
                  if (type == 273){
                  组包拾取();
                  while(拾取成功);
                  执行下一个拾取();
                  }
                  }
                  这样我们就初步解决了拾取很多物品秒中断的问题,但是拾取速度在网络差的情况下就会变得延迟略高
                  那么有小伙伴问了,如果出现制裁或者负重。这个物品一直捡不起来那要如何判定?
                  我贴出我以前用过的伪代码
                  ItemOI[64];(地面物品对象数组,保存地面所有的物品对象)
                  然后先遍历完成,将地面所有物品存入这个数组,然后依次执行入包操作,加一个超时判定即可,
                  由于楼主本人不会易语言所以只能以伪码的形式写出来,大家可以找易语言大神实现这一部分。


                  IP属地:河南10楼2016-06-22 02:55
                  回复
                    大晚上语言组织能力好差,有啥不懂的此楼留言明天统一回复。


                    IP属地:河南11楼2016-06-22 02:57
                    回复
                      上面那种方法并不能真正的解决组包中断,只是减少了百分之九十的中断而已。真正要做到不中断还是要从根源下手。


                      IP属地:河南12楼2016-06-22 03:00
                      回复
                        也就是大神们所说的主线程发包,这个小夏已经开源过了,收包hook,说下这个原理。物品掉落收包和怪物死亡收包走同一个包。
                        所以收包hook就是从怪物死亡收包中提取出来物品ID。
                        然后执行收包动作。
                        因为收包肯定走游戏主线程,所以在这里发送拾取包肯定不会中断。


                        IP属地:河南13楼2016-06-22 03:02
                        回复
                          李菊福


                          来自iPhone客户端14楼2016-06-22 05:09
                          回复
                            胡扯


                            来自Android客户端15楼2016-06-22 07:46
                            收起回复
                              那组包进图中断和卖物中断呢


                              IP属地:上海来自Android客户端16楼2016-06-22 07:54
                              收起回复