问题背景
使用帧同步实现多人联机游戏,补帧是一个绕不开的话题。常规的弱网补帧,SDK已经可以实现自动补帧,游戏可以不用关心。对于客户端长时间关闭后重新进入房间或者游戏中途有玩家加入的场景,新加入玩家联机对战SDK默认是从游戏第一帧数据补帧,而联机对战服务器不会缓存所有的补帧数据通常是缓存5分钟历史帧数据,这时候单纯依赖SDK自动补帧就会补帧失败了。如何解决这个问题呢,这里提供一种思路。
解决方案
游戏中指定房主或者房间内某个玩家,定时保存当前游戏需要同步的数据状态(比如每分钟刷新一次,刷新周期至少要小于五分钟),并记录当前帧id,然后将该数据通过一定手段同步给房间内其他玩家(比如通过修改房间属性,将其保存在房间属性中),当新玩家加入房间后可以从room实例中获取到房间属性,然后将其中记录的上一次房间状态数据进行解析,获取状态数据和帧id数据。
这时候只要以房间状态数据为基础,辅之以从帧id+1往后开始补帧就可以实现房间数据的同步了。
如何指定从某个id开始补帧呢?两种场景:
- 已启用SDK自动补帧场景,调用SDK提供的重置补帧起始id接口。
- 已关闭SDK自动补帧场景,调用SDK提供的手动补帧接口。
搞定!
官方资料:华为联机对战服务