• 游戏服务器领域的 “状态同步”、“非状态同步”


    目前游戏服务器领域服务器类型分为:三个大类

    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(联机事务)系统,但采用该方法需要遵循上述提到的内容。

  • 相关阅读:
    【linux基础】6. 日志,日志管理服务,自定义日志等
    python使用matplotlib可视化subplots子图、subplots绘制子图并为可视化的多个子图设置共享的Y轴
    稀土铕配合物掺杂聚苯乙烯荧光微球/含铕配合物聚苯乙烯荧光微球/稀土磁性荧光微球制备
    C++ Reference: Standard C++ Library reference: C Library: cmath: atan2
    “数智+绿色”驱动,宏工科技助力线缆线材稳定高品质生产
    ImageNet数据集用法
    Hadoop系列——企业存储系统概述,HDFS概述day2-2
    es官方为我们提供的堆内存保护机制-熔断器( breaker )
    【机器学习】21天挑战赛学习笔记(三)
    MS2401隔离Σ-Δ调制器,可替代ADI的AD7401
  • 原文地址:https://blog.csdn.net/liulilittle/article/details/127110774