帧同步的基础概念

相同的输入 + 相同的时机 = 相同的输出。
客户端发送操作信息到服务器,服务器收到后转播给所有的客户端,客户端接收服务器的操作信息后计算游戏行为的结果,
然后通过广播下发游戏中各种状态,客户端收到状态后显示内容。

帧同步和状态同步的对比

(状态同步的概念: 客户端发送操作信息到服务器,服务器收到后,计算游戏行为的结果,然后通过广播下发游戏中各种状态,客户端收到状态后显示内容。)
帧同步 状态同步
安全性
开发效率
网速要求
流量消耗
打击感表现 较好 较差
反外挂能力
断线重连速度 较长 较短
重播实现难易度

选择帧同步的原因

1. 节省消息量。每一次消息传递只需要附带操作信息就可以。而状态同步的消息包需要附带各种状态信息。
2. 方便实现实时对战类游戏 ------ 弱网络下的同步问题。用尽量少的消息就可以维持战斗的继续。
3. 降低服务器的计算压力。状态同步的战斗,服务器需要计算所有的战斗逻辑。
4. 提高开发效率。因为服务器可以只做消息的转播,客户端在开发中也可以先脱离服务器单独进行。
5. 在客户端表现方面获得更好的表现力。因为客户端获得了更多的表现管理权限,不必被数据硬性驱动。
6. 可以很方便的做战斗录像。有了战斗初始信息及战斗帧列表,就可以完美复现战斗过程。

网络协议的选择

  1. TCP — 消息稳定,但是慢。适合卡牌等即时性不强,通讯不密集的游戏。
  2. UDP — 消息传递快,但是不稳定,容易出现丢包和乱序的问题。适合即时性比较强的游戏类型。

帧同步设计中关键技术

  1. 随机值 & 伪随机算法。
  2. UDP协议的安全使用方式。

(1)《王者荣耀》团队提到的“可靠UDP传输”a.为每个数据包增加序列号,每发一次包,增加本地序号。b.每个数据包增加一段位域,用来容纳多个确认符。确认字符多少个,跟进应用的发包速率来决定,速率越高,确认字符的数量也相应越多。c.每次收到包,把收到的包上序列号变为确认字符,发送包的时候带上这些确认字符。d.如果从确认字符里面发现某个数据包有丢失,把它留给应用程序来编写一个包含丢失数据的新的数据包,必要的话,这个包还会用一个新的 序列号发送。e.针对多次收到同一包的时候可以放弃它。
(2)数据冗余法a.每个数据帧,包含过去2帧的数据,即每次发3帧的数据。b.如果帧丢失或者帧乱序,我们都判定为帧丢失。然后重新请求帧数据下载。

3.1 取消计算中的浮点数,或者创建浮点数安全使用环境。

4.1 游戏流畅性实现:

(1) 允许个别客户端丢失一些帧 - 不必在有些玩家帧数跟不上时限制所有的玩家一起等待,而是忽略掉这个玩家在这段时间的操作信息。当然这堆网络延迟比较高的用户来说不公平,但这是为了所有玩家游戏过程的流畅而做出的选择。总而言之,这是在游戏【公平性】与【流畅性】上的一个矛盾平衡。
(2) 客户端行为管理a.自驱动性。客户端可以把服务器广播下来的消息缓存一下,然后根据自己的表现来主动读取缓存消息队列。以此来保证客户端表现的连贯性。b.消息延迟处理。为保证消息被连续稳定地被处理,所以可以在消息接收后延迟一段时间再处理,利用这个时间差去准备更多的新消息。c.行为预测。当客户端向服务器发送一帧出去但是服务器还没回复时,让客户端继续一些预测帧的执行。这样能保证客户端表现的连续性,不需要等待服务器的反馈信息。虽然复杂的行为难以预测,但是简单移动行为的预测能让画面表现更连贯。如果预测失败,便让客户端预测帧回滚到服务器反回的最新帧便可。

5.1 设置内存快照。

为避免战斗重读所有帧的巨大消耗(比如战斗重连),可以让战斗先读取一个逻辑帧的内存快照,进而让重连直接从一个中间值开始。

6.1 自我检测以及问题上报机制。

(1) 设置自动机器人来大量测试逻辑,尽量多的暴露逻辑中的问题。
(2) 在逻辑出现不一致时,能自动收集全面的信息,并且能利用工具快速定位问题。

7.1 防外挂手段

(1) 投票制:几个客户端之间作对比,把少数逻辑不一致的当做“作弊者”处理。--- 不彻底的处理手法。适合单局多人网游。
(2) 裁判制:服务器做逻辑校验,所有和服务器计算结果不一致的数据都会被当做作弊数据处理。适合单局单人网游。
(3) 举报制:程序无法覆盖到所有的异常,可以通过玩家来曝光新的作弊手法。
(4) 客户端数据加密:尽管是肯定能被突破的防护手段,但是有总比没有强。
(5) 程序和策划要一起努力来防外挂,比如把容易出外挂的设计改掉。-- 这个修改其实是最根本最有效的~

帧同步必须要做到的事情

1.帧数据要小,消息包要小。
2.客户端逻辑和表现要分开。

易出错的地方:

1.需要循环利用的战场,一定要注意数据的释放。
2.若服务器也要计算战斗逻辑,那么务必保证客户端和服务器逻辑的一致性。

帧同步可能出问题的地方:

1.客户端拥有完整的游戏信息。容易出现的问题就是游戏中的透视能力,比如Moba游戏全图挂,棋牌游戏透视对方的手牌。
2.应用到格斗游戏,或者动作游戏

采用帧同步机制的游戏:

1.王者荣耀。
2.红色警戒、帝国时代、星际争霸、魔兽争霸三。

发散思考内容:

1.帧同步的开发为什么比状态同步要快? 为什么可以节省服务器的时间?。

2.LoL之前也是用的帧同步方式,为什么他后期做了修改?

开源项目: Almost-Famous

网络游戏中的帧同步与状态同步相关推荐

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

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

  2. 网络游戏同步方式(帧同步和状态同步)

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

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

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

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

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

  5. 游戏帧同步和状态同步

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

  6. 网络同步——帧同步和状态同步解析

    目录 概述 帧同步概念 状态同步概念 对比 概述 同步就是要多个客户端表现效果是一致的,而且对于大多数的游戏,不仅仅要表现一致,还要客户端和服务器的数据也是一致的.所以同步是个网络游戏概念,只有网络游 ...

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

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

  8. Unity帧同步和状态同步

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

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

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

最新文章

  1. Linux内核中关于定时器Timer的应用
  2. .Net Framework 各个版本新特性总结 (一)
  3. 我为什么还要造轮子?欠踹?Monk.UI表单美化插件诞生记!
  4. 透过 3.0 Preview 看 Dubbo 的云原生变革
  5. [Baltic2009]Radio Transmission
  6. Android 顶部切换实现(二)
  7. VHD工具-VHDTOOL
  8. gRPC-微服务间通信实践
  9. 栈的输出_算法:栈和队列题目集合(一)
  10. 6410的系统时钟设置(中)---相关寄存器介绍
  11. 关于卷积神经网络可视化的一点心得
  12. CF280C Game on tree(期望dp)
  13. Virtualbox以及VWare在Win10下的不兼容
  14. java游戏2333整合包,3dm游戏运行库合集离线安装包
  15. Swagger2自定义添加请求头key-value暴力猴插件
  16. MySQL定时任务,清理表数据
  17. java里面getsource_java e.getsource
  18. 使用python给微信推送信息(一)
  19. pytorch 中 .detach() .detach_() 和 .data的区别
  20. Linux开发运维常用命令

热门文章

  1. [Linker Error] Unresolved external ‘GetModuleFileNameExA‘ referenced
  2. iphone如何查看dns延迟_购买二手iPhone,如何正确快速查看手机串号?避免被坑!...
  3. 用Js实现页面按名字搜索功能
  4. 关于js的CreateTextFile和OpenTextFile
  5. CAD创建面域的方法
  6. McAfee新手详尽攻略(转东转西)
  7. Blah数集 描述: 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素; (2)如果x在集合Ba中,则
  8. 魔兽世界暗影国服服务器未响应是什么意思,进入《魔兽世界》暗影国度前,你需要知道这几件事...
  9. 小学多媒体计算机室管理计划,先进小学电脑室工作计划 - 范文中心
  10. Option PE header