前言
上一篇我的想法有点太抽象了,看起来是对的。但是对于我的游戏来说如何实现呢?想了很久,发现我的游戏和传统的MMO的移动不同,而是类似贪吃蛇的移动。贪吃蛇会有同时转向和移动的情况,出现这种情况时,移动轨迹将是弧线。如果是直线部分,将会和MMO类似。如果是弧线部分呢?有点懵逼了。具体的实现如下。
游戏操作
W 开始移动
会将前进速度设置为10(参考值)S 停止
前进速度设置为0A/D 左/右转向
当按住时,玩家会持续转向,直到玩家松开
角色运动状态
初步定义一个同步间隔为1秒,这个可以调。
停止
直线速度为0
同步信息:位置,转向停止同时转向
直线速度为0,弧度速度为0.2(参考值)
同步频率:每一秒
同步信息:同步结束时玩家将会在的位置,转向,运动状态移动同时不转向
直线速度为10,弧度速度为0
同步频率:每一秒
同步信息:同步结束时玩家将会在的位置,转向,运动状态移动同时转向
直线速度为10,弧度速度为0.2
同步频率:每一秒
同步信息:同步信息:同步结束时玩家将会在的位置,转向,运动状态
玩家初始状态为停止
服务器
服务器端会比较简单,根据客户端发送的信息改变状态,并发送同步信息
客户端
对比服务器的同步信息,客户端的流程如下
和服务器状态同步
判断是否需要位置直接同步
比如当客户端处于状态1,服务器也是状态1时,直接同步。根据不同的状态选择不同的插值方式。
比如状态2,则插值为用多少秒,转到多少度;状态3,则是用多少秒,移动到什么位置。持续的时间是用服务发过来的截止时间减去客户端记录的服务器时间。
结语
以上都是理论之言,并没有经过性能测试。对比之前的帧同步,发送消息的频率已经降低了很多,而且客户端的动作也会变的平滑。进一步的提高同步性能,我建议:
- 位置同步采用UDP,显然会提升效率
- 对发送的目标的范围进行优化,比如玩家可见范围内才同步其他玩家。