资料都来自于网络。
前言
在制作网络游戏的时候,经常会讨论同步方式。同步这个话题就是让不同客户端的游戏表现同步。
王者荣耀是使用的帧同步(Lockstep),有成功案例,后续才会有很多人想着跟进。
帧同步:服务器按照帧转换客户端的操作,其他客户端依赖这些信息在本地模拟表现。
状态同步:客户端操作的时候,只能将状态数据提交给服务器,服务器得到了通过运算将最终结果广播给全部客户端。
成功案例清单:
帧同步 | 状态同步 | |
---|---|---|
FPS | doom | CSGO、守望先锋、逆战、绝地求生 |
MOBA | 王者荣耀、DOTA、英雄战境 | 全民超神、LOL、DOTA2 |
SPT | NBAOline、街头篮球、FIFA | |
FGT,ACT | 街霸 | 怪物猎人 |
RTS | 星际争霸、魔兽争霸 | |
MMO | 全民斗战神 | 魔兽世界、轩辕传奇、天涯明月刀 |
RAC | QQ飞车 | |
其他 | 街机、主机模拟器、刀塔传奇、剑与家园 | 各种类型都有 |
大量玩家参与的游戏只能使用状态同步。要求及时性高,
本文就记录一下同步的差异,各项资料都来自于baidu搜索的。其实在google上搜索,也没有看老外大量使用 state sync,frame sync,frame lock sync之类的文章。可能是我使用的词汇有问题。
网络同步模式的演化史
参考文档有:《The-DOOM-III-Network-Architecture》
-
J.M.P. van Waveren
-
March 6th 2006
概念
游戏需要再四个要素上做平衡:
一致性,响应性,带宽,延迟
FPS实体列表:
玩家,怪物,导弹,门。
参与者去管理和维护自由的那份拷贝,一种实现是通过施加一致性的逻辑推动所有的状态去同步地更新,另一种实现是随着时间的流逝不断地比较和发送最小的状态变化和差异。
P2P模型
Doom(1994)的网络模型是完全同步的P2P系统。每秒对玩家动作(move/turn/use/fire, etc.) 采样 35 次 (得到一个 tick command) 并发送给其他所有玩家,每个玩家都接受来自所有玩家的 tick command,当某个玩家收到所有其他玩家的下一帧 tick command 后,该玩家的本地游戏状态推进到下一帧。这样的后果是全局性的延迟 (每个玩家从做出动作到收到反馈的响应时间) 由最慢网络连接的玩家决定。
存在问题清单:
- 所有玩家都需要主动维护完美的状态同步,由于硬件不同(有时甚至是未初始化的变量)等引入的不一致,会让每个参与者细微的不同被累积下来,导致参与者之间显著的视觉和逻辑的差异。这种不一致的引入很难查,因为只有当它们累积起来才会有明显的效果,而等感觉到差异时,真正的问题已经发生很久了。
- 完全同步的网络无法跨平台。不同的硬件上,由不同编译器生成的汇编指令有时会产生轻微不同的行为 (浮点指令尤甚)。
- 随着玩家数量增长,延迟会迅速变得难以接受。而且只要有一个玩家的网络有波动,会影响到所有人的体验。
随着玩家数量增长,带宽需求会指数性地同步增长。 - 同步网络由于只发送 tick command,所有玩家必须同时启动游戏 (来保证游戏状态的一致性) 无法做到随时的加入和退出。
- 由于玩家本地维护了所有的状态,方便了作弊的实现。
Packet Server(包的简单中继)
P2P模型上增加Packet Server,将接受到的tick command转发,这样减少了客户端直接的链接。能解决某个玩家慢的问题。