小游戏版的QQ飞车、王者荣耀,为什么还没出现?
策划baba的“梦想”,总能击中开发的“脆弱的心房”——
简单来说,帧同步是一种在本地就可以完成画面渲染结算的多人同步方案。
作为小游戏最新上线的能力,帧同步服务尤其适用于多人在线对战游戏。
通过帧同步服务,开发者只需要关注前端小游戏逻辑相关就可以了,无需头痛前后端联调成本、服务器部署维护,并发量大等问题。
现在,帧同步能力已经在能力地图上线了。登录微信公众平台,在首页即可直接查看。
或者手机登录小游戏数据助手,点击「帮助」-「能力地图」也可以查看新能力。
除了能有效降低开发运维成本,实际应用上,帧同步还有着低流量,高一致性,高实时性的特点:
低流量:帧同步只转发玩家的行为,要广播的数据量并不大。
高一致性: 相同的数据输入保证了客户端之间的一致性。
高实时性:服务端仅负责转发帧数据,同步频率精确到每帧,保证了数据的实时性。
想要抢先体验帧同步服务?可以查看这款由微信官方运用帧同步能力,做出的(已开源)示例小游戏。
目前,已经有第三方小游戏接入帧同步服务,并且已经上线。
以“羽毛球高高手”为例,接入帧同步能力后,游戏运行流畅,延迟低,体验好。
想知道如何接入帧同步服务?请往下看(前方纯技术干货,非技术人员请小心观看)
多人游戏能力详解
多人游戏能力由帧同步和房间服务两部分组成。
(多人游戏能力框架)
| 房间服务
房间服务主要负责房间创建,好友邀请和房间成员管理等功能。
房间服务由基础库和微信后台采用websocket长连的方式通信,在链路上保证了数据的可靠性。
第三方小游戏通过基础库暴露的房间服务的接口,可以实现创建房间,加入房间,邀请好友加入房间等操作。
| 帧同步服务
帧同步服务则负责收集用户上传的操作指令,封装成帧数据以固定的频率下发到客户端。
帧同步服务由微信客户端和微信后台采用可靠性UDP的方式通信,通过冗余传输的策略保证了数据的可靠性。
UDP相比于TCP等可靠传输协议,数据传输的实时性大大提高,在多人对战等实时性较高的游戏内,帧同步和UDP的优势就更加明显。
小游戏只需要调用基础库暴露的接口上传帧指令到微信后台,微信后台会存储房间内各个玩家每帧的操作指令,并通过固定的频率(小游戏可以自行设置)将房间内每帧的数据下发到各个客户端。
(服务端下发游戏帧示例)
由于服务端下发帧的频率是固定的,玩家通过帧序号便可以推测出当前游戏的时间线和进度,各个客户端同样的计算方式也就保证了游戏的一致性。
注:服务端在周期时间内没有收到游戏指令,也会下发空帧。通过固定频率下发,客户端通过收到的游戏帧就可以推算出当前游戏时间,进而通过游戏时间更新和运算游戏逻辑。
游戏流程示例
(游戏流程)
以两个客户端为例,多个客户端同理:
1. 客户端a调用 createRoom
创建游戏房间
2. 客户端a调用 shareAppMessage
邀请客户端b加入房间, 分享时需要携带房间信息唯一标识:accessinfo
(创建房间时获取)
3. 客户端b收到分享后调用 joinRoom
加入房间
4. 所有玩家都加入房间后,各自调用 startGame
开始游戏。各个客户端会在游戏开始时收到onGameStart
回调。
5. 游戏开始后,各个客户端可以通过 uploadFrame
上传自身游戏操作指令。
onSyncFrame
回调则会以固定的频率将服务端收到的给个客户端操作指令同步给所有的客户端,小游戏解析各个客户端的操作,在本地运算游戏逻辑即可。
| 更多接口和文档介绍请看: