今天看到来自于牛客网的一个问题:https://www.nowcoder.com/discuss/569983
Q: 对帧同步和状态同步进行介绍
A:
- 状态同步的逻辑在服务端,客户端仅作渲染。客户端的操作反馈到客户端,服务器更新状态,再传回客户端。
- 帧同步的逻辑在客户端,服务端负责向所有客户端广播动作。客户端的操作本地即时计算结果。
优劣分析:
对比项 | 状态同步 | 帧同步 |
安全性 | 较为安全,计算在服务端,攻击成本大。 | 较不安全,本地修改数值即可完成作弊。 |
性能压力 | 服务器较大,需要演算所有客户的逻辑 | 客户端压力较大,需要在本地演算逻辑 |
流量 | 较大,客户端通信需要实时更新状态 | 较小,客户端通信仅需要传输动作 |
回放&观战 | 较不方便,需要服务器进行逻辑计算向客户端进行发送 | 较方便,便于本地化,仅需存储操作序列。回播时,根据序列进行复盘即可(e.g: 星际2,忍者必须死3) |
对于回放,需要注意:使用帧同步,本地要防止“蝴蝶效应”,即:随机数、计算精度等复盘时不鲁棒的地方,容易导致回放与原有比赛不同的情况。
比较著名的例如使用帧同步的忍3,观战bug迟迟修不好,很影响体验。估计时开发时候不规范导致的。
参考资料
https://www.cnblogs.com/sanyejun/p/9069165.html