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

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

游戏服务器领域的 “状态同步”、“非状态同步”相关推荐

  1. ajax同步非阻塞,同步、异步、阻塞与非阻塞理解

    同步跟异步,阻塞与非阻塞,这两组概念出现在IO操作中常常让人混淆不清,这里是根据自己想到的,看到的,学到的,整理了自己的理解. 这四个概念两两组合,会形成四个新的概念,如下: 1.同步阻塞 :客户端发 ...

  2. 解码mmo游戏服务器四:如何实现玩家状态的高同步性

    问题引入:这里主要讨论状态同步,client A发生状态变化(移动,换装,属性变化等),将变化的信息同步到client B,最简单做法就是直接通过服务器中转然后广播出去,但是由于存在网络延迟,所以cl ...

  3. 教你从头写游戏服务器框架

    本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传" ...

  4. golang游戏服务器框架_教你从头写游戏服务器框架

    需求 由于"越通用的代码,就是越没用的代码",所以在设计之初,我就认为应该使用分层的模式来构建整个系统.按照游戏服务器的一般需求划分,最基本的可以分为两层: 底层基础功能:包括通信 ...

  5. 教你从头写游戏服务器框架 1

    本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传" ...

  6. 游戏服务器中常见的数据一致性问题分析

    什么是一致性问题 在游戏服务器的开发中,我们经常会碰到所谓"一致性"问题,以及碰到各种为了解决这种问题所做的"方案",那么,什么是一致性问题呢?其实非常简单,就 ...

  7. 游戏服务器框架 技能buff篇

    游戏服务器框架 技能buff篇 1.状态 state 全局API 用于定义各种状态检查 bool IsDead(){     // 死亡buff     if (buff->id == 1000 ...

  8. 非阻塞同步机制和CAS

    文章目录 什么是非阻塞同步 悲观锁和乐观锁 CAS 非阻塞同步机制和CAS 我们知道在java 5之前同步是通过Synchronized关键字来实现的,在java 5之后,java.util.conc ...

  9. 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步

    这篇是对书本 网络多人游戏架构与编程 的学习第二篇(第一篇:多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | ...

最新文章

  1. linux bin命令解释,Linux:“awk”命令的妙用
  2. 【踩坑之路】CentOS 下 LNMN 环境配置
  3. 不仅仅是虚拟化--Windows 7 SP1 Windows 2008R2 SP1解析
  4. [Luogu 3258] JLOI2014 松鼠的新家
  5. Redis --数据类型 [1]
  6. 分析师:BTC既是通胀对冲工具 也是有指数级增长潜力的资产
  7. lisp单个文件的编译
  8. 想要给视频去色有什么方法?原来用这个就可以了
  9. 禁用联想笔记本电脑自带的键盘
  10. 自定义IE地址栏图标
  11. 查找mysql.sock_找不到mysql.sock,我在哪里可以找到它?
  12. 美团四面 Java 岗,终获 offer,我是这么回答面试官的
  13. opencv(二)图像像素提取及操作
  14. 瑞星卡卡升级出现错误:kmon.dll.zip,错误代码:0x0/0x0(chech)
  15. 不要告诉我你懂margin
  16. Web设计中的中国传统色彩速查表
  17. javaWeb项目设置error页面
  18. 网络安全中的大数据治理
  19. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、极昼、极夜)...
  20. MathWorks官方MATLAB/Simulink基础入门视频教程 笔记(Simulink基础)

热门文章

  1. react基础知识1
  2. 【为宏正名】本应写入教科书的“世界设定”
  3. SQL自定义排序规则
  4. 瑞芯微 rknn 移植记录
  5. 【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声
  6. flutter 布局时内容溢出容器的类似Overflow-hidden的简单解决
  7. 学习光线追踪(19)---光源[1]
  8. 蓝桥杯单片机第十一届代码(省一)
  9. linux中nice和prio关系,进程调度 – Linux内核API task_nice
  10. CA6140车床拨叉831005”零件“粗铣8mm槽”工序的夹具设计(说明书+CAD图纸+SolidWorks三维图+工序卡+过程卡)