在做网络游戏的时候首先要做的是选择一种同步方式来使用,网上的文章都是说帧同步与状态同步的选择,但是又经常讲的模糊不清,我大概整理了一下,并且有一种我们现在项目用的网络同步方式
状态同步
状态同步就有好几个说法,说是同步状态,同步操作等,又找不到一遍文章能清楚的讲一遍什么是状态同步。
所以大概总结一下就是,状态同步是通过每个客户端发送自己的操作给服务器,这时客户端不进行任何动作,服务器统一计算后并把结果同步个每一个客户端。
这里要点就是,同步操作,服务器结算结果。
这里推荐两篇文章
http://www.cnblogs.com/sevenyuan/p/5283265.html
https://www.zhihu.com/question/36258781
这里讲了这两种同步方式的区别,但是依然没有很清楚。状态同步也找不到更好的文章,如果你有的话也请在评论区分享一下一起学习。
帧同步
帧同步是在关键帧的时候同步操作给服务器,服务器转发操作给每个客户端。客户端之间要接受到关键帧才可以进行操作。
帧同步里面有一个关键技术就锁帧,也就是如果没有收到广播的关键帧不能进行下一步操作。大家静止不动。
而现在的游戏会有一个聪明一点的方法叫做乐观帧锁定
乐观帧锁定通过定时发送关键帧的方法,不锁定任何客户端,服务器一定时间间隔就发包给每个客户端,包里可能是空包也有可能是你自己活着别人的操作。而客户端就通过定时或者每当操作就发包的形式告诉服务器自己的操作。
但不论是什么形式的帧同步都是客户端收到其他玩家的操作后自己模拟行为。所以这个就需要大家如果是随机的时候要保证一致,也就是有一样的随机种子,而且在每个客户端中无法保证一定一致,也就是这个原因帧同步一般会用着竞技类游戏,游戏都是一盘一盘的来,每盘开始就给大家统一的第一帧和随机种子,保证这个游戏在每个客户端中基本一致
其实在网速好的时候这些都不是问题,基本上不同客户端上的表现基本一致。
而当网速不一致时,当你选用乐观帧同步的话就可以保障网速好的不会被网速差的玩家卡住
帧同步有好多好文章,这里也推荐两篇
http://mp.weixin.qq.com/s?__biz=MzA5ODExMTkwMA==&mid=2650255562&idx=1&sn=a457e6dbf7bdd99d1e75dbf7e500dd44&scene=0#wechat_redirect?ref=myread
http://www.skywind.me/blog/archives/131
这两篇是已经讲的非常清楚,非常好的两篇文章
所以能看到,其实在手游时代,状态同步基本是不可取的,服务器压力太大,对网络要求太高。
而帧同步的话也会选择乐观帧同步,保证在网速好坏不同的情况下还能一起玩,并且网速好的玩家不会受干扰。
自己游戏的同步方式
我们是一个mmoarpg手游,也就是动作类网游。
由于我们的游戏类型,其实不需要真的非常同步,并且可能有很多个玩家同屏,首先抛弃状态同步
接着我们也不是竞技类游戏,所以基本上也不需要帧同步。
所以我们同步也就是客户端发送请求给服务器,服务器验证一下,如果出入太大强行拉回,不然也不返回给自己客户端,只同步位置给其他客户端。
技能上就是客户端请求使用技能,在技能中的打击帧告诉服务器这个人我能不能伤害,服务器判断并同步给大家这个伤害。
所以基本上算不上什么同步方式。
但是如果我们之后需要做更为严肃的pvp玩法,则需要帧同步来进行操作。这个可能会在后面补充
这里面还有很多可以一起讨论的地方,也希望大家评论一下一起讨论
还有一篇王者荣耀的同步技术文章
http://mp.weixin.qq.com/s/agXeHpN2vkgl5jKsLvi2Ug