目前游戏服务器领域服务器类型分为:三个大类
1、状态同步
2、非状态同步
2.1、帧同步
2.2、状态帧同步
3、无状态同步(类似 Web 后台应用开发)
状态同步(一):
状态同步服务器指,当游戏客户端(玩家)发生了任何行为就立即向游戏服务器发送消息同步状态,服务器处理状态后向场景内其它玩家进行该玩家的状态同步。
比如玩家在场景内移动了,就立即进行处理,但它带来了游戏服务器频繁的处理来自状态改变及广播同步,如场景对象移动与战斗会带来大量且过度频繁的消息同步,代价为:非常吃网络质量及宽频,更多的客户端与服务器消息报文序列化带来的CPU/RAM硬件资源负担。
例如:玩家场景内移动了一定距离,则立即同步到服务器,状态同步很难做到预测玩家的行动路径,在把移动的路径点同步到服务器上面进行处理。
帧同步(二):
帧同步服务器指,当游戏客户端(玩家)发生了任何行为,并不是立即向游戏服务器发送消息同步,而是把 “一秒钟”
划分为若干个的行为帧,在一帧范围内的行为都将被粘合在一起,游戏服务器按照一秒(10帧)、(5帧)等频率定期的处理来自游戏客户端投递的玩家行为集合。
例如:玩家场景内移动了一定距离,不会立即推送到游戏服务器,游戏客户端需要对玩家的移动路径进行途径预测,游戏服务器每帧循环TICK时,逐帧播放玩家的移动轨迹。
一个游戏场景来推导什么时候适用帧同步,当我们在开发MMORPG、TPS/FPS题材类型的网络游戏时,服务器系统开发与设计人员希望多个玩家之间尽可能做到RTT时延平衡,例如:FPS题材游戏如果采用状态同步,那么RTT时延极低的玩家本身就相当于官方层面开了物理外挂,设想两个人同时开枪RTT时延低的玩家拥有更优先击杀“Hit
box(受击盒)”目标玩家的物理优势,而采用帧同步可以令玩家与玩家之间的RTT时延优势不在明显。
当然采用帧同步的游戏服务器仍适用于MMORPG,这是因为对于MMORPG类型的游戏不需要过快的状态同步方法,这会带来大量不必要的宽频及硬件的开销,150RTT对玩家来说不会有过大顿挫感,FPS题材游戏100RTT,每秒10帧的处理频率是勉强够用,13~15帧一秒左右最佳,即介于60~80RTT之间。
缺点:每一帧服务器都需要向游戏客户端发送数据。
状态帧同步(三):
状态帧同步则是 “帧同步” + “状态同步”,二合一的设计方法,一部分行为采用状态同步,一部分采用帧同步的方法。
游戏客户端把来自玩家的操作行为上传到服务器,游戏服务器按一秒划分为若干个的逻辑帧进行处理,而游戏客户端更趋向于行为预测,不需要等待服务器下发快照数据就可以提前执行玩家的操作,等游戏服务器下发快照数据以后,游戏客户端在验证行为的正确性,如果行为不正确就会进行回滚操作,所以此类同步方法设计的网络游戏,有些时候或许能看到玩家移动了一段距离后被拉回源点的情况。
无状态同步(四)
无状态同步,是指游戏客户端发送一个操作到游戏服务器,游戏服务器会立即处理,但游戏服务器不保存任何的状态,所有的行为操作均为被动驱动,即游戏客户端发生了某个行为向游戏服务器进行请求动作(Request
Actions)服务器立即进行处理并应答动作(Response Actions),这类游戏H5/微信小游戏多点。
因为所有的操作均在游戏客户端可以被正确完成,不需要游戏服务器介入,而游戏服务器只做数据的存储及部分验证,显然它不涉及到游戏之间的各种状态同步。
上述四种均有各自的优势及缺陷,具体采用那种类型取决于游戏本身,不是随便那个都可以适用所有的游戏题材及场景:
状态同步(一)
适用基于多线程(MTA)、多进程(MPA)的服务器架构,多个线程或进程并发处理,但需要注意线程安全性,可以适用 Actors
基于消息驱动的异步编程模型、TAP基于任务及无栈协同程序的异步编程模型(stackless/await, async)、stackfull
基于有栈式协同程序的异步编程模式【例如:golang-channel】
但主流是采用 Actors 基于消息驱动的异步编程模式,对于其它异步编程模式不太熟悉,把控不住的童靴,不建议采用其它异步编程模式,学习及试错成本是很高的。
帧同步(二)
适用基于多线程(MTA)、多进程(MPA)的服务器架构,但常见于单线程(STA)+ 多进程(MPA)的服务器架构
此类游戏服务器,通常为主线程按逻辑帧进行循环TICK(滴答),处理每一帧不同类型的事务,每个不同类型的事务的帧速是不通的,例如:移动、AI对象、玩家非状态同步类型报文处理。
多线程(MTA)为一个游戏服务器进程内,同时存在若干个帧循环处理的工作线程,适用于场景服务器,即若干个场景实例运行在该游戏服务器进程内,处理AI对象、玩家场景内战斗等行为。
状态帧同步(三)
省略过程,类似上面 “一 + 二” 类。
无状态同步(四)
适用大型分布式游戏服务器,OLAP(联机分析)、OLTP(联机事务)系统,但采用该方法需要遵循上述提到的内容。