帧同步
服务器负责转化客户端的操作,每个客户端在固定的逻辑帧执行该帧所有客户端的操作命令,通过在严格一致的时间轴上执行同样的命令序列得到同样的结果。
服务器按帧转发客户端的操作,客户端进行确定性运算和一致性模拟
状态同步
服务器承载所有计算,客户端只做表现。主流的大型MMO游戏都采用状态同步。
帧同步 | 状态同步 | |
---|---|---|
一致性 | 逻辑上绝对一致,天然要求一致性 | 也可以做到绝对一致。但一般来说增量式预表现的状态同步会有一些拉扯不同步现象。 |
响应性 | 操作需要发送到服务器再等服务器返回按帧执行,可以做预表现但很受限,响应性较差 | 状态同步可以更好的进行预表现,响应性较好。 |
带宽 | 人数较少时带宽极低,但随着人数增长,带宽几何程度的增加。帧同步无法做 MMO 类的游戏 | 可以通过各种方式优化带宽,可以开发千人万人战斗游戏。 |
延迟 | 对延迟要求高,高延迟体验很差 | 可以通过延迟补偿,智能预测等优化方式在高延迟下降低延迟感受。 |
开发效率 | 开发简单,几乎不需要联调,但排查 Bug 很难。任何一个错误都有可能导致不同步的严重后果(硬件、随机数、未初始化变量、使用浮点数、渲染帧计算逻辑等等)。 | 开发会复杂很多,需要大量联调 |
玩家数量 | 少量玩家 | 少量和海量都可以 |
跨平台 | 较难(不同的硬件不同的编译器等原因导致一些计算不一致,设备不一致,特别是浮点数,可以通过定点数来解决,但是要求非常严格,测试难度很高) | 较容易 |
外挂 | 在服务器也跑战斗逻辑的情况下,天然就容易反作弊。但如果服务器不跑逻辑,多人竞技也可以通过投票机制等反作弊。但是都反不了全图挂 | 防外挂难度依赖服务器跑逻辑的比例和开发时是否考虑反作弊,可以一定程度上避免全图挂。状态同步可以在反作弊上做的更极致 |
优化 | 服务器可以做到极低的开销。客户端负载较高,需要整个战斗的所有运行(要求逻辑和渲染分离) | 支持更多的优化手段 |
对于大部分游戏来说,两种同步方式都可以使用。但相比之下状态同步适用型更广,特别适合复杂度高,延迟要求高,玩家多的游戏,例如FPS,MMO等等。帧同步相对适合小兵很多,玩家少且固定,单局时间短,对打击感公平性要求高,追求一致性的游戏,例如格斗,运动,RTS,卡牌,MOBA等。
https://zhuanlan.zhihu.com/p/38468615
https://zhuanlan.zhihu.com/p/104932624