返回

联机小游戏同步技术初探

Created By ZOU on Nov 11 2020

最近在试着写一个联机小游戏,使用了cocoscreator当作游戏开发引擎,在第一次使用时发现其操作界面跟unity3d很类似,组件挂载等操作也相同,使得在实际使用时减少了不少摸索的时间。很快就开发出了一个界面,其中有可以移动的角色,一个大场景地图,可以记分的排行榜,接着就是实现怎么客户端之间进行实时同步。之前没了解过这些,通过查阅一番资料后得知,同步技术目前主流的有:帧同步、状态同步,下面来挨个简要的说明下其含义。

帧同步:帧同步顾名思义,控制每一帧从而达到多端同步。具体怎么实现呢,首先,服务端需要每隔一段时间为所有客户端发布一次”步骤信息“,步骤信息就是玩家在操作时执行的步骤,玩家在操作时把”步骤信息“发送给服务端,服务端接收信息后再返还给所有的客户端,客户端再依据返还的步骤信息进行操作。所有客户端都是依据服务端发送的步骤信息进行操作,只要保证接收到的步骤信息并且根据步骤信息的计算出的结果保持一致(计算过程中肯定会有浮点之间的计算,不同cpu不同设备计算肯定会有偏差,需要通过定点数去算,GitHub 上有很多定点数库的开源,可以自行去搜索),就可以达到同步效果。

状态同步:状态同步就是客户端中所有的状态信息都保存在服务端中,客户端的位置信息都通过服务端读取,客户端发送操作信息给服务端,服务端接收后计算对应玩家的操作。对应的结果会定时同步给所有的客户端,从而达到同步效果。

差异:两者的差异在于,使用帧同步时,服务端方面的开发会少很多,服务端只是做操作转发处理,带宽占用也会少很多,但是遇到一些网络波动,断线重连,或者丢包之类的,就比较难处理,而相比状态同步,服务端方面开发会多很多,操作基本都在服务端内处理,转发带宽占用会更大,但是遇到网络波动,断线重连比较容易处理一些。

我在开发中使用的是帧同步技术,帧同步服务端通过node创建websocket去开发,开发途中也遇到不少的坑,期间好几次都想换同步方案,但是想想都开发了那么多了,还是算了把,哈哈,帧同步想多端保持一致还是挺难的,会有不少问题,慢慢的一步步攻克吧,把现在做的这个游戏给逐步完善。

标签: node.js CocosCreator websocket