和MMORPG不同,实时动作型网络游戏 追求操作的响应要求极高(<150ms)。
动作型网络游戏的制作人希望做到单机游戏的体验,网络游戏的服务。
  
  网络指令在多客户端间的同步算法,从原理上来说,围绕两种特性的取舍而定:
  * 牺牲局部实时性:某程度的互等待,保证各客户端间指令集在指定时间段一致。
  * 牺牲局部一致性:容许客户端本机先行模拟,等待后续指令到达纠正。(DR)

网络的存在导致鱼与熊掌不可兼得,所以现在市面上的动作网络游戏都有
如下的妥协和折衷实现:
  * 在客户端本机上算大量关键运算来保证手感
  * 玩法上对直接进行的决定性互动的要求不高
  * 接受时不时网络延迟导致等待的缺点来维持复杂精确的玩法
  * 策划维持可玩性的底线下对一些一致性的要求减低
  
  实时性需求非常高的网络游戏,舍是一种关键艺术。
  FPS,赛车,RTS,泡泡堂/QQ堂,模拟器联网等类型的网络游戏在一定程度上
都有以上的一个或多个取舍抉择。

---------------------------------------------------------------------

在很多实时同步的网络游戏中,都用到UDP而不是MMORPG中的TCP进行
非关键消息的同步(更有些赛车类型的游戏可能直接起用p2p网络互联):
非关键消息允许丢包,可对物体状态做客户端预测补偿;UDP甚至可方便地穿墙;
所以UDP比TCP在这种情况下更合适。Dead Reckoning是常用的客户端
预测的技术,而更细节的客户端预测对不同类型的游戏而言有不同的扩展。
这方面的技术在之前的HalfLife / Quake3 / CounterStrike等UDP中心
服务器做动作认证的FPS游戏中应用得比较成熟。

虽然觉得真正的p2p网状互联的动作同步不适合网游(一致性和防外挂考虑),
但观察了几个游戏后发现泡泡堂,跑跑卡丁车,QQ飞车,名将三国等一些游戏
确实不同程度上使用网状p2p(有些在公共场景组队就启用p2p进行位置同步),
而且有些的收发包分别都达到20个/秒的量,几乎赶上渲染帧率的一半。

直观的猜想是它们玩家间动作显示上具实时性,但关键交互结果是不具实时性的。
而道具的使用大部分都提倡 范围化 和 时延化,以减少网络延迟的影响。
这样可以简单地提高udp发包频率和数量,客户端尽情模拟后拉扯:
如果大家不作弊,如果平均每秒接到的包够多,简单插值和预测一下自然很平滑。
而关键的属性改变,战场物品掉落,死亡,胜利等,则用非实时的中心服务器
信息保证保证结果唯一性。

虽然如此,还是觉得p2p的体系应该有一定的peer间同步法则。
  之前没了解过p2p体系的同步知识,所以先查阅了一些比较容易找到的paper,
所描述的分布式状态同步算法大致有如下几种。

---------------------------------------------------------------------

Lockstep Synchronization

最直观同步方案:任何peer的action要得到其他所有peer的同意才能发起。
  见下图:
  
   
  
  如果使用非网状的p2p模型,提供peer master来做统一状态运算,
  那lockstep模型便成为严格的帧同步模型,这是大多RTS,模拟器联网,
以及一些提供建主机后连接的休闲动作游戏采用的同步模型;通过频繁
对时,便可以像编写串行单机指令一样来进行多个peer的事件指令同步。

lockstep原是监狱用语,指犯人列队步行时的同步串链式行进,非常形象。
最初并非设计用于游戏,而是军方的军事互动仿真程序。IEEE DIS标准指出:
100-300ms的双程总延时,对军事性互动仿真模拟是可接受的。而根据一些统计,
第一人称射击游戏中的玩家双程延迟普遍在50-300ms的区间内。
而如果玩家都在一个LAN内进行p2p连接通信,双程延迟可能控制在20ms以内。

优点:简单易实现,不会出现任何的不一致性。
       在延迟小(round-trip < 100ms)且稳定的环境下非常合适。
       在实时性要求不高的玩法(比如回合制玩法)中也非常合适。
 缺点:游戏节奏受最慢的peer影响巨大。一人卡机,所有人受影响。
       恶意的peer可以用伪造大延迟的方式来获得好处,从而破坏游戏公平性。

---------------------------------------------------------------------

Bucket Synchronization

见下图:
 

原paper很长,这里只按照个人理解编排步骤:
  (原文是彻底分布式的网状p2p,为方便理解,下面将player B称为peer master,
并假设它负责对时任务,以省掉NTP对时系统的理解过程)

1. 设定最大容忍延迟值为 PlayoutDelay(如120ms)。
   PlayoutDelay为:peer master执行指令N的时刻 - 远程peer的指令N发出时刻所对应的bucket时间段起始时间
2. 设定游戏时间轴上每隔BucketFrequency(如40ms)归一个新bucket来存放动作指令。 
3. 开始游戏前,peer master发送对时命令给所有peer进行对时。
4. 因为peer master知道所有peer的平均延迟 AvgLag,那它执行步骤3后,
   延迟 AvgLag 时间后,开始游戏逻辑。
5. peer master自身发出的操作指令,虽然不需要经过网络,但也需要强行延迟
   投递到Ti对应的bucket中,其中:
      Ti = 当前时刻所属bucket时间段的起始时间 + PlayoutDelay
6. 如果peer master接到一个动作指令,但:
   peer master当前时间 - 动作指令携带的发送时间 > PlayoutDelay
   那peer master会直接丢弃这个动作指令(也就是将超时到达的指令当作无效)
7. 如果peer master接到的动作指令不超过上述6中描述的范围,那会把这个指令
   放入Ti所对应的bucket中,其中:
    Ti = 指令包携带的发送时间戳所在的bucket时间段起始时间 + PlayoutDelay
8. 每个bucket对应的时间段末端,peer master执行这个bucket中所有的指令,
   将结果状态更新到画面。
9. 因为有网络的存在,可能某些bucket中没有指令,原版MiMaze游戏实现是不处理。
   但paper中提供了基于Dead Reckoning的预测状态显示方法。
10. 游戏过程中,peer master以某种时间间隔作频率进行各peer对时,
   保证将各peer机器时间的误差控制在一个可接受范围内。

优点:不依赖最慢peer来决定游戏流畅度。流畅度是维持在平均预定义水平的。
  缺点:对超过MaxLag的指令做丢弃。除了原paper中的3D吃豆人迷宫式游戏这种
        经过特殊剪裁的游戏,动作游戏对延迟玩家的操作做丢弃,似乎很难想象。

---------------------------------------------------------------------

TimeWrap Synchronization

它是一个基于某些状态支持回滚(rollback)的同步算法。有点类似HL的做法。
  简言之,就是对每个操作指令的执行后保存一个状态快照(snapshot),
各个peer按照自己的预测先行显示,但在发生一致性冲突的情况下,
回滚到上一个状态,并重新将指令序列在基于回滚后的快照的基础上再
执行一次,以获得正确的当前状态。

---------------------------------------------------------------------

Trailing State Synchronization

对TimeWrap Synchronization的一种改进。TimeWrap方案中建立snapshot是
以指令数量(1或少量几个指令)间隔为单位;而TSS方案则以某种延迟值(100ms)
间隔为单位对游戏做snapshot(比如100ms前做一个,200ms前做一个...)。
当发生一致性冲突时,寻找最远需要开始计算的snapshot,并将该snapshot到
现在为止的时间内的指令重新执行,得到正确的最新状态。

---------------------------------------------------------------------

参考文章:
<<Minimization of Latency in Cheat-Proof Real-Time Gaming by Trusting Time-Stamp Servers>>
<<End-to-end transmission control mechanisms for multiparty interactive applicatins on the Internet>>
<<Dead Reckoning: Latency Hiding for Networked Games>>
<<An Efficient Synchronization Mechanism for Mirrored Game Architectures>>

---------------------------------------------------------------------

zz: http://blog.csdn.net/akara/article/details/5885037

(转) 网络游戏实时动作同步方案手记相关推荐

  1. 网络游戏实时动作同步方案手记(1)

    [原创]网络游戏实时动作同步方案手记(1) by AKara 2010-09-07 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @wei ...

  2. 网络游戏实时动作同步方案手记(3)

    基于上面的(1)(2)两篇同步方案知识,可以写个demo来试验同步的效果. 需要找一个p2p库来做系列同步算法的demo.选了RakNet-4.0.Beta5.   官方网站是http://www.j ...

  3. 金山逍遥网 sersync 服务器实时镜像同步方案

    金山逍遥网 sersync 服务器实时镜像同步方案 1. sersync+rsync原理 2.inotify和sersync同步的区别 3. 配置sersync+rsync实现实时同步 2台cento ...

  4. 基于数据库数据增量同步_基于 Flink SQL CDC 的实时数据同步方案

    简介:Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的 ...

  5. cdc工具 postgresql_基于 Flink SQL CDC 的实时数据同步方案

    作者:伍翀 (云邪) 整理:陈政羽(Flink 社区志愿者) Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink P ...

  6. 一文带你玩转实时数据同步方案

    1.概述 1.1.目标 实时数据同步主要实现从源数据库到目标数据库的实时数据同步.源数据主要支持mysql数据库,目标数据包括mysql数据库和hbase数据库. 下面是实时数据同步的数据流转图,my ...

  7. 动作手游实时PVP帧同步方案(客户端)

    1.概述 1.1.基于UDP的帧同步方案 在技术选型方面,之所以选择帧同步方案,在Kevin的一篇介绍PVP帧同步后台实现的文章中已经做了详细叙述,这里简单摘要如下: 高一致性.如果每一帧的输入都同步 ...

  8. 网游同步技术:实时动作游戏同步方式和传输协议选择

    http://www.gameres.com/478430.html 6 天前 上传 下载附件 (88.33 KB) GameRes游资网授权发布 文 /  韦易笑 实时动作游戏在近年来得到迅猛的发展 ...

  9. 再谈网游同步技术:实时动作游戏同步方式和传输协议选择

    如今十年过去,网上越来越多的人开始讨论游戏同步技术了,然而很多文章往往只针对某种特定的游戏情况,而观点又经常以偏概全.很多人并没有真正开发过实时动作游戏,更别说了解同步技术的前世今生了.转载别人的观点 ...

最新文章

  1. python简单代码input-Python简单程序的练习
  2. Careers support for Masters students cambridge
  3. 都2021年了,不会还有人连深度学习还不了解吧(六)-- Padding篇
  4. PCR之父凯利·穆利斯:有才,真的可以为所欲为
  5. 法拉第未来宣布汉福德工厂获得最终生产使用资质
  6. 如何在Java中分割字符串
  7. sqlmap安装(python2或python3都行)
  8. 做下一个互联网时代的“水电公司”——融云的通信云视野与蓝图
  9. c语言试题答题卡,c语言题目及答题卡.docx
  10. IDEA+Java+Servlet+JSP+Mysql实现新闻发布系统
  11. Flash游戏开发中的人物走动实现方法
  12. java:123321是一个非常特殊的数,它从左边读和从右边读是一样的。   输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
  13. DeFi 2.0的LaaS协议Elephant,重振DeFi赛道发展的关键
  14. 你一定要知道的,8大花店运营指南
  15. Win7 EFS 加密文件图解
  16. Arduino接入DFrobot EasyIOT实验(Arduino+APP Inventor+EasyIOT+百度AI API+Python数据可视化)
  17. Xming(windows下的X Server)的使用,在windows下运行你的终端和所有基于XWindow的程序
  18. 迅为3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心方案
  19. 个人网站搭建之服务器环境搭建
  20. echarts3.0之关系图详解

热门文章

  1. 【微信小程序】理论学习笔记
  2. 返回字符t在字符串s中最右边出现的位置,若s中不包括t,则返回-1
  3. python 获取邮箱附件
  4. css写三角形,对号√
  5. 中国网建SMS短信接口调用(java发送和接收手机短信)
  6. 原装Win8本改装Win7不完全指南
  7. SYN攻击(DDOS攻击的一种)
  8. 如何点击按钮弹出新窗口,输入数据后返回并刷新页面
  9. Linux-Audio Codec
  10. 恒星播放器 1.400 中文版 ,一款全格式高清4K播放器