背景:
帧同步技术很早就有了,从过去PC时代的war3、星际,到手游时代的王者荣耀、皇室战争。那么如何将其广泛运用于H5游戏开发呢?我们做了个JS版的帧同步SDK,有几十款游戏接入上线。开发者不用关心联网细节,就能高效地开发出表现精准、打击感强、服务器压力小、支持回放复盘的多人联机小游戏。
帧同步的实现方式有很多种,这里采用乐观帧的方式。原理简单来说就是:
- 服务器收集各客户端的操作指令,将其组装入数据帧。
- 服务器以固定的时间间隔,不断下发数据帧给各客户端。
- 客户端依序接收数据帧1,执行逻辑1,运行至状态1;接收数据帧2,执行逻辑2,运行至状态2…循环往复。
- 只要各客户端接收相同的数据帧,执行相同的逻辑,就能运行至相同的状态。这就形成了同步。
下面就简单聊一聊我们使用帧同步做联机H5小游戏,实践中所遇到的那些坑。阐述内容主要基于TypeScript语言,Cocos Creator引擎。下文将从数据一致性、体验优化、性能优化这三个部分展开。
一,数据一致性
通过以上原理可以看出,各客户端要保证同步,需要保证执行相同的逻辑,能得到相同的结果。而影响结果的第一要素就是数据不一致。
1.浮点数
JS中经典的问题:0.1 + 0.2 === 0.3 ? 答案是false。0.1