魔兽官方对战平台掉线后怎么回去?
在游戏的过程中假如意外掉线,那么重新登录继续进入游戏后可以由系统进行断线重连,快速追赶游戏进度,让你去找战友们继续战斗。
简单说一下断线重连的原理:
断线重连的核心其实就是两个:1)封包回放;2)在合适的时机屏蔽用户的操作。
对于第一点实事上很多平台已经实现,原理比较简单,就是把用户的所有封包原封不动的发给他,由于war3的机制,当收到大量的封包的时候,war3会采取加速的形式追赶进度。
这里稍微提一下加速的倍率,在我内部测试的时候,如果不产生操作指令(例如一直站着不动50分钟),加速的倍率可以到128倍以上(由于war3限制了最高8倍速,所以这个值也是需要hack修改的),而如果是实战中,比如一局dota,即使我将内部的速度调成128倍,这个速度最高只能是十几倍。
那么有没有更好的方案,比如不追赶进度,像dota2那样直接加载不是更好吗?很可惜,当时在我研究的时候发现这个方案不可行,原因是war3并没有保存全局状态的逻辑,也没有从一个状态加载游戏的功能。
再谈谈第二点,这个应该是断线重连的核心问题了。其实这个问题需要注意的很多,比如如何保证在追赶进度的时候用户不能输入操作,同时追赶完进度后要在合适的时机放开限制。
这里只提一下难点,因为war3的封包处理和逻辑计算是在不同的线程的,如果处理不当会导致各种诡异的bug,比如和队友在不同的时空中(进去玩过的朋友应该有这种体会,那种在你的电脑里你已经成神,但是在队友或者其他人那里你早已成鬼,但是你们还可以打字交流。这个bug后来发现是封包发送部分处理的时候有些bug,并没有完整的回放所有封包导致的,并非是断线重连这个解决方案本身的bug)。