想对Hay Day(卡通农场)的设计进行一些推演,所以就有了本系列的文章。
尝试了在玩的过程中断开网络,此时对菜地进行了移动和收割,过了大概10多秒,提示重新连接,重连之后发现刚才的操作依然有效。由此可以得到以下猜测结论:
一. Hay Day并非一有数据改动的操作就马上向服务器发包,而是先在本地存储以下数据:
* 存储上一server回包之后的操作序列,比如包含了3各:
- 将 ID为1001的对象(菜地)移动到了坐标x,y;
- 收割了ID为1002的作物;
- 在ID为1003的菜地上播种了玉米等等
* 由于要刷新界面表现,所以本地也需要存储操作结果
二 . 到了固定的时间间隔(比如30秒),向服务器发操作序列:
(1) 如果服务器将操作序列验证成功,客户端则不必进行任何处理;
(2) 如果服务器验证失败,客户端则需要将操作回滚(这里要求操作序列对象支持undo)
(3) 如果网络连接断了,也不会马上回滚操作,而是提示用户重连;如果用户重连成功,则再次发送操作序列,重复步骤(1)(2)
三. 在这里还不能断定Hay Day使用了长连接还是短连接:
因为如果按固定时间间隔向服务器发包的话,长短连接都可以满足需求,即使在使用长连接的情况下,发现网络断了,也不会马上通知用户,而是等到时间间隔到了再通知。
唯一只能用长连接的情况是,服务器需要主动实时地下发一些信息给客户端
四. 如果在固定的时间间隔内没有任何操作,则客户端发的是空操作序列,服务器返回的统一游戏时间用来校准。
客户端时间是不能作为依据的,所以会隔一段时间进行校准。用户有序的输入决定了游戏每一时刻的状态。
五. 客户端使用的是系统时间进行计时
此结论得出过程如下:播种麦子,看着倒计时,出去将网路断掉,然后切回游戏,继续看那块麦子,发现时间会正确刷新(补足enterBackground的那部分时间流逝)
下次继续~