在网络游戏中,服务器和客户端的同步技术是一个绕不开的话题,也是在技术选型时,首先需要确定的方案。网游中的同步技术主要有两个技术方向,帧同步和状态同步。本文简单讨论了帧同步和状态同步,整理并对比了他们的优缺点。

一.帧同步和状态同步的介绍

帧同步:同步的是各个客户端的操作。一般的流程是客户端上传操作到服务器, 服务器收到后并不计算游戏行为,而是负责转发客户端的操作,每个客户端在固定的逻辑帧执行该帧所有客户端的操作命令,通过在严格一致的时间轴上执行同样的命令序列得到同样的结果。这里最重要的概念就是:相同的输入 + 相同的时机 = 相同的输出。

帧同步实现成本相对较低,开发比较快速,服务器性能和带宽开销很低,有点去中心化的意思。帧同步多用于游戏单位比较多的及时策略游戏,比如有很多个子弹的飞机类游戏、塔防类游戏等。

帧同步的流程

1.同步随机种子:游戏中设计随机数的使用,通过同步随机数种子可以保持随机数的一致性

2.客户端上传操作指令给服务器,操作指令包含游戏操作和当前帧索引

3.服务器广播所有客户端的操作,如果没有操作也要广播空指令来驱动游戏帧前进

状态同步:同步的是游戏中的各种状态。一般的流程是客户端上传操作到服务器,服务器收到后计算游戏行为的结果,然后以广播的方式下发游戏中各种状态,客户端收到状态后再根据状态显示内容。

状态同步其实是一种不严谨的同步。它的思想中,不同玩家屏幕上的表现的一致性并不是重要指标, 只要每次操作的结果相同即可。所以状态同步对网络延迟的要求并不高。状态同步最广泛的应用应该是在回合制游戏中。

状态同步的流程:

1.客户端上传操作到服务器

2.服务器收到后计算游戏行为的结果(如技能逻辑、战斗计算等)

3.服务器以广播的方式下发游戏中各种状态

4.客户端收到状态后更新本地状态(如动作状态、Buff状态、位置等)

二.帧同步和状态同步的对比

使用场景

帧同步:游戏单位比较多的及时策略游戏,比如有很多个子弹的飞机类游戏、塔防类游戏。

状态同步:玩家比较多的大型MMOARPG游戏,所有游戏内容服务器控制,安全性高。

流量

状态同步比帧同步流量消耗大,例如一个复杂游戏的英雄属性可能有100多条,每次改变都要同步一次属性,这个消耗是巨大的,而帧同步不需要同步属性;例如释放一个技能,服务端需要通知客户端很多条消息(必须是分步的,不然功能做不了),而帧同步就只需要转发一次操作就行了。

战斗回放

帧同步的回放比状态同步好做得多,因为只需要保存每局所有人的操作就好了,而状态同步的回放,需要有一个回放&观战服务器,当一局战斗打响,战斗服务器在给客户端发送消息的同时,还需要把这些消息发给回放服务器,回放服务器做储存,如果有其他客户端请求回放,则回放服务器把储存起来的消息按时间发给客户端。

安全性

状态同步的安全性比帧同步高很多,因为状态同步的所有逻辑和数值都是在服务端的,如果想作弊,就必须攻击服务器,而攻击服务器的难度比更改自己客户端数据的难度高得多,而且更容易被追踪,被追踪到了还会有极高的法律风险。而帧同步因为所有数据全部在客户端,所以解析客户端的数据之后,就可以轻松达到自己想要的效果,例如moba类游戏的全图挂,吃鸡游戏的透视挂,都是没办法防止的,而更改数据达到胜利的作弊方式(例如更改自己的英雄攻击力)可以通过服务器比对同局其他人的战斗结果来预防。

服务器压力

显而易见,状态同步服务器压力要大很多。在状态同步的技术方案下,几乎所有的运算,都是放在服务器完成的。

总结一下:

帧同步

优点:

1.只接收和发送动作消息, 流量小

2.即时性好, 动作判定在本地

3.服务端只转发, 相对而言工作量小很多

缺点:

1.恶意攻击难防, 比如劫持攻击消息, 将攻击力加大十倍

2.客户端的性能需要能够处理大量数据

3.断线重连时需要计算此时刻前所有动作的最终状态

4.各个客户端的计算需要保证结果一致

状态同步

优点:

1.断线重连简单, 直接恢复状态

2.恶意攻击需要攻击服务器

3.客户端只展示状态和生产动作, 相对而言性能要求不是很高

4.客户端逻辑比较简单, 发动作, 同步状态

缺点:

1.流量消耗大, 因为接受的是全局状态

2.反馈比较看网络状态, 因为需要等待服务器发送反馈状态

3.服务端性能要求较高, 因为每一个动作, 都可能会在全局修改一些状态, 服务端需要将所有动作的影响计算出来

游戏帧同步和状态同步相关推荐

  1. 多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | 帧同步和状态同步

    今天继续开新坑,尽管过了很多 Unix 套接字编程的坑,但是实际还是有很多不同场景和性能的需求,以及最服务器架构的内容也就接触过 preforking 和 master 带 worker 而已. 所以 ...

  2. 游戏网络同步:帧同步和状态同步

    游戏网络同步机制分为帧同步和状态同步. 帧同步是将客户端的操作通过服务端转发给所有客户端,其他玩家同步当前其他玩家的操作,具体执行逻辑写在客户端,再根据处理逻辑后的状态显示,以迁移一致性为主.具体游戏 ...

  3. 帧同步_帧同步和状态同步该怎么选(上)

    这是一篇拖延了2年多的文章-2017年10月份开始写的,直到这次过年才写完... 前言 随着王者荣耀的崛起,使用帧同步(Lockstep)的游戏也越来越多,关于帧同步和状态同步的讨论争论也有不少,那么 ...

  4. 帧同步和状态同步(二)案例分析

    转自:http://www.gameres.com/489361.html 腾讯一下出了两款MOBA游戏,全民超神,王者荣耀,玩了一下,效果不错,就分析了一下它底层的一些技术,发现一个是采用的状态同步 ...

  5. mtk 帧同步_【小松教你手游开发】【面试必读(编程基础)】网络游戏同步方式(帧同步和状态同步)...

    在做网络游戏的时候首先要做的是选择一种同步方式来使用,网上的文章都是说帧同步与状态同步的选择,但是又经常讲的模糊不清,我大概整理了一下,并且有一种我们现在项目用的网络同步方式 状态同步 状态同步就有好 ...

  6. 【网络同步】浅析帧同步和状态同步

    前言 谈到网络游戏,不可避免要谈到现有两种比较常见的网游同步技术:帧同步和状态同步 说到这两个名词,大家夸夸奇谈,都能讲上些许自己的见解,我反正啥也不懂 这篇文章就打算着重学习一下这两种技术的基础和原 ...

  7. Unity帧同步和状态同步

    帧同步 适用游戏类型 对于延迟要求较高的游戏,例如:FPS游戏, RTS游戏(即时战略游戏)等. 原理 帧同步不同步状态,只同步玩家的操作指令,操作指令包含当前的帧索引.这里最重要的概念就是 相同的输 ...

  8. 从游戏服务端角度分析移动同步(状态同步)

    从游戏服务端角度分析移动同步(状态同步) 参考文章: https://www.lfzxb.top/ow-gdc-gameplay-architecture-and-netcode/ https://z ...

  9. 帧同步与状态同步:方案比较

    状态同步:大型的MMOARPG ,比如魔兽世界 帧同步:网络条件好的局域网,比如魔兽争霸,优化过的MMRPG, 比如王者荣耀 相比之下状态同步适用型更广,特别适合复杂度高,延迟要求高,玩家多的游戏,例 ...

最新文章

  1. 90%的人会遇到性能问题,如何用1行代码快速定位?
  2. SimplifiedHibernate:简化了的Hibernate
  3. Win7 64位系统XMind环境配置
  4. 热部署Devtools的简单使用
  5. 学习笔记(十八)——MongoDB(CRUD)与Python交互
  6. WIN32 SDK对COM的支持
  7. Docker从入门到实践笔记(一)
  8. 转载:opencv中imshow函数运行中断的解决办法
  9. 【自用】 VS2017 部分快捷键
  10. Win10系统特别卡的一个原因
  11. arm linux 页表寻址,操作系统中的页表寻址
  12. SAP License:HANA在线日志被误删后如何恢复?
  13. 【技巧】LeetCode 86. Partition List
  14. Linux服务器创建及维护记录
  15. 基于springboot+vue的大学生健康档案管理系统
  16. 携程基于云的软呼叫中心及客服平台架构实践\n
  17. 基于Jtopo的网络拓扑编辑器初探
  18. 《玩透嵌入式C的角角落落》深入分析sprintf和printf函数
  19. LVM逻辑卷快照的添加,删除逻辑卷!
  20. 用遗传算法解决VRP问题

热门文章

  1. cesium--添加模型
  2. RAID的几种工作模式
  3. GIS大讨论(十):GIS专业就业之职业态度
  4. zookeeper领导者选举源码分析
  5. R语言--计算各种距离
  6. 蓝桥杯 模板Template Part9:PCF8591 ADC/DAC
  7. 移动安全app渗透测试之渗透流程、方案及测试要点讲解
  8. @DateTimeFormat@JsonFormat注解详解
  9. Java Date Calendar类的使用 如何计算两个日期之间有多少天
  10. openGL ES进阶教程(五)制作一个简单的VR播放器,播放全景视频