精华内容
下载资源
问答
  • 网络游戏数据同步的实现 一:状态同步、帧同步基本原理概述
    千次阅读
    2020-07-13 01:15:28

    什么是游戏的数据同步

    数据同步是指使用某种方式让同在一局游戏中的多个客户端保持游戏进程同步。

    什么游戏需要数据同步?

    1. 联机游戏(cs、饥荒、dead4ife2等)
    2. 网游(魔兽、天堂、传奇)
    3. 需要快照、快进、回放、观战的游戏(英雄联盟、和平精英等网游)
    4. 实际上带有存档功能的单机游戏,基本使用的都是状态同步原理。

    如何判断一个游戏是什么数据同步类型呢

    1. 当你在游戏过程中 断开网络连接,如果游戏人物反复重复断网之前的动作,那毫无疑问就是帧同步。

    2. 如果断网后,人物执行完当前动作就只是在执行默认动作,那这个一定是状态同步。

    3. 如果断网重连时,需要动作预读的,就是帧同步。

    4. 单机游戏,全都是状态同步。

    当然还有更明显的区分方法:
    传统冒险类网络游戏,几乎都是状态同步。游戏整体逻辑处理由服务器群组成。
    竞技类网络游戏,几乎都是帧同步。因为竞技类游戏需要更高速的数据同步。

    数据同步的两种方式

    比较流行的数据同步方式主要分为以下三种:状态同步、帧同步、混合同步

    状态同步

    状态同步的流程是,由主机或服务器进行游戏逻辑运算。所有的客户端发送【操作指令】数据到主机或服务端,由主机或服务器处理过逻辑运算后,将场景中相应的物体状态数据,下发到每个客户端,完成同步。
    其实在单机游戏中,就已经遍布状态同步的功能实现。单机游戏中的存档功能,就是一种状态的快照保存。
    【图】

    客户端 服务器 客户端发送操作指令给服务器 操作指令 服务器收集当前帧中所有客户端发送的操作指令,并在服务器进行游戏逻辑运算,再导出场景中所有对象的状态,广播给所有客户端 当前帧中相关物体的新状态 根据服务器发回的状态信息还原场景 客户端 服务器

    【优点】

    1. 由于每一帧的状态都会进行保存,所以可以更方便的切换到指定的帧状态,进行回滚操作
    2. 符合传统互联网的B/C通信逻辑。
    3. 由于逻辑计算都在服务端进行,所以安全性非常高。除非是设计不够完善或是进攻服务器,否则难以被外挂支配。

    【缺点】
    4. 开发复杂度较大。由于需要匹配对象的所有参数,所以数据规范化十分重要。
    5. 由于每个对象都有大量的自有参数,所以传输数据量也非常庞大,相应的也会影响网络流畅度。
    6. 涉及到动作动画等操作,需要修改为量化操作。开发比较复杂。
    7. 游戏的核心逻辑计算都在服务器运行,所以服务端压力比较大

    帧同步

    帧同步的流程是,客户端发送操作指令到服务器,服务器负责验证操作和帧序列,然后将在指定帧内发生的用户操作指令发送给所有的客户端,战斗逻辑运算在每个客户端执行。
    【图】

    客户端 服务器 客户端发送操作指令给服务器 操作指令 服务器收集当前帧中所有客户端发送的操作指令,验证操作指令和帧的序列号,再将当前帧中所有客户端的操作指令集体打包广播给每个客户端 当前帧中相关物体的新状态 根据服务器发回的操作指令还原场景 客户端 服务器

    【优点】

    1. 数据传输量较小
    2. 逻辑计算在客户端执行,服务器压力小
      【缺点】
    3. 由于逻辑在客户端处理,必须保证客户端状态的高度还原。
    4. 由于逻辑端在客户端处理,断线重连时,需要从第一帧开始演算到当前帧,才能同步到当前帧状态
    5. 不能使用自带的物理引擎、浮点数、随机数。否则会导致不同终端设备不能同步还原帧。

    混合同步(状态同步 + 帧同步)

    这两种方式组合起来就能实现更强大的同步系统
    正常同步时使用帧同步,当掉线、存档、回滚、或重播、速播的时候,使用状态同步。

    数据同步设计中需要注意的问题

    1. 首先游戏的逻辑处理不能在生命周期函数中
    2. 游戏的主循环需要是帧速可控的。
    3. 为了多端同步,需要使用经过处理的浮点数。与浮点相关的数据类型是:float、double、vector2、vector3、quternion。需要做相应的转换。一般情况下保存快照时浮点数*1000,解析快照时浮点数/1000可用。此处是已经实现好的数据实现代码,复制可用
    4. 用查表函数取代三角函数等数学工具函数。
    5. 使用自定义seed随机数,避免误差。
    6. 由于数据传输的速度问题,帧同步的频率不可能太高。所以会导致有卡顿现象,所以需要制作过度帧。过度帧就类似于补间动画。
    7. 如果确定使用animator状态机控制动画,那么不要把重要逻辑与状态机的时间绑定。比如攻击时的碰撞盒开关。、
    8. 如果确定使用animator状态机,不要用同开关的动画剪辑序列。比如组合拳。
    9. 不应在游戏主逻辑循环中使用协程
    10. 不应使用本地差异数据,例如Time、Date等
    更多相关内容
  • 数字复接系统中帧同步基本原理

    千次阅读 2021-07-09 16:05:32
    目录 一、 引言 二、帧同步基本原理 2.1巴克码简介 2.2关键技术 2.2.1搜索态 2.2.2校核态 2.2.3 同步态 一、 引言 在数字通信网中,为了扩大传输容量和传输效率,通常会把若干低速数字信号合并成为一高速数字...

    一、 引言

    在数字通信网中,为了扩大传输容量和传输效率,通常会把若干个低速数字信号合并成为一个高速数字信号,然后通过高速信道传输。数字复接就是实现这种数字信号合并的专门技术。系统框图如下图所示:
    在这里插入图片描述
    数字通信时,一般以一定数目的码元组成一个个“字”或“句”,即组成一个个“帧”进行传输。为了保证接收端分接系统能正确的恢复出信号,需要对接收到的信息进行帧同步。帧同步信号的频率很容易由位同步信号分频得到,但每个帧的开头和末尾时刻却无法由分频器的输出决定。帧同步的任务就是要给出这个“开头”和“末尾”的时刻。

    二、帧同步的基本原理

    实现帧同步的基本方法是在发送端预先规定的时隙插入一组特殊码型的帧同步码组,在接收端由帧同步检测电路检测该码组以保证收发帧同步。要求插入的码组具有尖锐的自相关函数,并与信息码的差别大,以便接收端正确识别和减少伪同步的概率。帧同步码组可以集中插入在每帧的开头位置,称为帧同步码集中插入法,也可以分散插入在各个支路的前面,称为帧同步码分散插入法。

    2.1巴克码简介

    目性能较好且广泛应用的一种同步码就是巴克(Barker)码。它是一种具有特殊规律的二进制码组,并且是一种非周期序列。一个n位的巴克码组位{x1,x2,x3…xn},xn取值为+1或-1。其局部自相关函数为:
    在这里插入图片描述
    用matlab代码可以仿真出其局部自相关函数,7位巴克码组仿真结果如下图:
    在这里插入图片描述
    从其局部自相关函数图中可以看出,当接收到的帧头同本地巴克码组完全对齐时,其自相关函数具有峰值。可通过设定判决门限,将该码组识别出来。
    目前能找到的巴克码组如下表所示:
    在这里插入图片描述
    下图所示为13位巴克码识别器的原理图:
    在这里插入图片描述
    当输入码元加到移位寄存器时,如果移位寄存器的某位进入的是1码,则移位寄存器该位的1端输出为+1,0端输出为-1;反之,当进入的是0码时,移位寄存器该位1端输出为-1,0端输出为+1。实际上该搜索电路是对输入的巴克码进行相关运算,当一帧到来时,首先进入搜索电路的是帧同步码组,只有当13位巴克码在某一时刻正好全部进入13位寄存器时,13位移位寄存器输出端都输出+1,相加后最大值输出为+13,其余情况都小于+13.

    2.2关键技术

    电路只有进入同步态,才能提供正常的服务。但在传输过程中,由于干扰和环境影响会使帧同步码组中码元发生错误,乃至失锁,电路就难以保证服务质量,有必要对电路采取同步状态保护措施。同时由于信息码是随机的,完全可能出现与帧同步码相同结构的码组而造成接收端的假同步。在采取了同步状态保护之后,必须在随后的规定时刻上至少M次不再出现伪同步码组,才能向下一个码组搜索。这明显拉长了同步搜索的时间,有必要采取相应的搜索校核措施。
    下图所示为同步电路状态机的状态转换图:
    在这里插入图片描述
    状态机共设计了三个状态搜索态、校核态、同步态。

    2.2.1搜索态

    开始时,在数据接收的起始时刻或帧未同步时,帧同步电路进入搜索态。在数据流中搜索帧同步码,接收码流逐比特进入同步检测电路,当数据流与帧同步码相同时,表明已经搜索到一个同步帧头,可进入帧同步校核态。即开始时,只要检测到一个帧同步码组就进入校核态。

    2.2.2校核态

    为了防止信号中出现虚假同步,找到第一组同步码后跳过1帧长度必须再次确认帧同步码。若连续经过M帧同步码确认均同步正确,则系统立即转入同步态。连续同步次数小于M或有一帧未同步,系统都将返回搜索态。由首次搜索到帧同步码到进入同步态的M帧时间叫后方保护时间

    2.2.3 同步态

    帧同步处于同步状态时,若连续N帧帧同步码正确则仍保持在同步状态。考虑到接收数据流的帧同步码可能受外界干扰而存在误码,在同步状态中只有连续N帧丢失同步码,才进入失步状态,并返回搜索态。其中N帧的时间叫前方保护时间。**即在同步状态下,并不是帧同步码一出现误码,就意味着系统失步,而返回搜索态。**只有连续N帧丢失同步码,才意味着系统失步,重新返回搜索态。

    展开全文
  • 据了解,在8月之后的两月间,《王者荣耀》技术团队对这产品进行了非常深度的优化,并攻克了局内同步、网络要求,以及性能表现的大难关,成功达到了腾讯六星产品的标准。比如延迟、卡顿等不同步问题的出现概率...

     以下为《王者荣耀》技术总监复盘回炉历程演讲全文

    如今已经大获市场成功的《王者荣耀》一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知的调优期。也就是在2015年8月18号正式不删档测试版本推出之后,被腾讯评级为不达六星之后的时间。

    据了解,在8月之后的两个月间,《王者荣耀》技术团队对这个产品进行了非常深度的优化,并攻克了局内同步、网络要求,以及性能表现的三大难关,成功达到了腾讯六星产品的标准。比如延迟、卡顿等不同步问题的出现概率从过去的1%,降低到了0.01%,大幅度地改善了游戏体验。

    今天在Unity举办的Unite 2017 开发者大会上,《王者荣耀》项目组技术总监邓君针对这款游戏的调优历程进行了复盘,回顾了这款产品在技术层面遇到的三大问题,以及他们的解决方案。

    值得一提的是,参会的开发者也非常关注这次的演讲内容,不仅会长当中人员爆满,围住了整个演讲场地,在演讲结束之后,葡萄君也听到一路上诸多开发者对《王者荣耀》技术经验的探讨。

    以下内容经游戏葡萄整理发布。

    大家好,我是《王者荣耀》的邓君,很高兴今天能够有这样一个机会跟在座的同行一起聊聊技术,互相交流,也感谢Unity提供这样的机会,可以由一个互动。

    这次的主题主要是讲一下《王者荣耀》从立项之初经历的惨淡时期到华丽的翻盘,包括碰到技术方面的问题,以及游戏方向上的改变。

    我是技术出身的,整个课题也是技术面的,会重点介绍王者荣耀和现在见到大部分不同的技术方案,它实际原理、问题和优化的思路。

    图片

    先简单自我介绍一下,我是2004年加入腾讯,在腾讯做了4年多的应用层面开发,还包括web各种各样后台都做过,经历比较丰富。在2009年我回到成都,刚好成都的岗位也就只有游戏部门是比较合适的,就转行做游戏了。在成都这边,参与过《QQ封神记》的开发,之后又开发了《霸三国OL》这款游戏,这款游戏开发了三年多,我经历了它从1.0、2.0,再到3.0的版本迭代,这之后才转型做手游,直接做的《王者荣耀》。

    图片

    现在了解《王者荣耀》或者在玩的人确实比较多,但是我们曾经也没有想过它有这样的结果。当时端游很久都没有做出来成绩,业绩和收入都面临比较大的问题。2012、2011年前后,《霸三国OL》做到1.0版本,游戏中玩家需要控制多个单位,操作起来很难,一开始可以操作5个单位然后变成3个,但即便只有3个单位,操作也让人觉得也很痛苦,于是我们慢慢5个单位的技能合在一个英雄身上,不断地优化。能看到,在MOBA领域,你要做创新,还要脱颖而出,是很难的事情。

    在2014年底,2015年初的时候,我们准备组建一个手游团队。因为当时国内市场基本上都在开发手游,能够继续开发端游或者要准备立项端游的非常少,包括腾讯也只有2、3款端游在开发。手游是一个机会,我们当时就希望在2015年把我们的《霸三国OL》端游在手机上呈现。

    这个时候我们进行了一个初期Demo的验证,做Demo的只有三个人,引擎、框架、后台,一系列制作下来大概花了两周到三周的时间。这个Demo里有基本的进游戏、选人,然后可以释放技能,正常的战斗,到结算。

    Demo的引擎我们采用了Unity,做完之后也觉得Unity很好用,开发效率确实比较高。

    2014年年底的时候,我们制作人去公司开会,当时做一个非常明智的决策:我们需要马上暂停端游的开发,直接做手游。就是这样的一次决策,真正地扭转了我们整个团队的命运。如果晚一年,可能今天爆红的MOBA游戏就是另外一个,而不是王者了。

    于是接下来在2015年,我们才有了想法开始独立招聘20、30人来做这个手游项目。

    从端游转型做手游,肯定要面临选择,到底要用什么样的引擎,采用什么样的方案进行手游的开发。当时,腾讯以及成都周边的创业团队,基本上都用Unity,我们做Demo的时候,也选择大家用过的,已经有产品进行验证的引擎,同时我们也考察它适不适合我们的团队。

    Unity在我们当时做Demo时的理解来看,它确实对中小团队,甚至对一些大型项目来说,都有几个比较明显的优势。

    1.易上手,我们花三周就可以做出Demo,可以看到易上手是它的一个非常大的优势。

    2.它的工具都是很完善的,能够做到一站式解决,你不需要在这里面下载工具,那里面额外补充一些插件。

    3.它插件资源很丰富,我们从最开始做Demo的时候,基本上都可以从Asset Store中找到一些可以用来验证我们想法的资源,可以加快我们开发的效率。

    4.上面这三点加起来,就能体现出它非常明显的优势,即开发效率特别高。

    5.它还有跨平台的优势,它本就是跨平台的引擎。

    6.最后它还能让你更方便地补充技术人员,社招也很容易招聘到熟悉Unity的开发人员。

    对比以前我们自己做引擎,或者用过其他的引擎,从效率上来讲,最终我们选择了一个开发效率最高的引擎Unity。

    图片

    我们从端游转手游是在2014年底,但真正开始研发《王者荣耀》是在2015年3月份的时候,这个时候项目的要求是让开发的周期尽量短,尽快把手游做上线。我们原本在《霸三国OL》的开发团队大概有40、50个人,再加上后来加入的人员,形成了100多人的团队,进行了游戏的开发。

    在2013、2014年的时候,手游在PvP的方面都比较弱,大部分是卡牌游戏、单机游戏。我们原本是做的端游,它的生命力包括趣味性也是很足的,所以我们做手游的目标,就是即使游戏里会存在PvE的闯关内容,但我们的核心还是要把PvP做好,让玩家有真正的对抗,让玩家与玩家有交流,能体会到这样的游戏乐趣。

    既然选择PvP,那么这款产品就是一个网络游戏,而选择网络游戏的同步机制,就是我们首要考虑的问题。同步机制中最常见的应该是CS状态同步,我们的端游也是这样做的,当然,状态同步也有他的优缺点。

    先看一下状态同步的优点。

    第一,它的安全性非常高,外挂基本上没有什么能力从中收益。

    第二,状态同步对于网络的带宽和抖动包有更强的适应能力,即便出现了200、300的输入延迟再恢复正常,玩家其实也感受不到不太舒服的地方。

    第三,在开发游戏过程中,它的断线重连比较快,如果我的游戏崩溃了,客户端重启之后只需要服务器把所有重要对象的状态再同步一次过来,重新再创建出来就可以了。

    第四,它的客户端性能优化优势也比较明显,比如优化时可以做裁剪,玩家看不到的角色可以不用创建,不用对它进行运算,节省消耗。

    再说一下我认为的缺点。

    第一,它的开发效率相对帧同步而言要差一些,很多时候你需要保证服务器与客户端的每一个角色对象的状态之间保持一致,但事实上你很难做到一致。

    比如客户端和服务器端更新的频率,对优化的一些裁剪,网络的抖动等等,你要让每一个状态在客户端同步是比较难的,而你要想调试这些东西,来优化它带来的漏洞、不一致的现象,花费的周期也会比较长,想要达到优化好的水平也比较难。

    第二,它比较难做出动作类游戏打击感和精确性。比如说你要做一个射击类角色,他的子弹每秒钟要产生几十颗,基于状态同步来做是比较难的,因为系统在很短时间内,会产生很多数据,要通过创建、销毁、位置运算来同步。

    第三,它的流量会随着游戏的复杂度,而逐渐增长,比如角色的多少。我们做《王者荣耀》时,希望在3G、4G的网络条件下也能够玩PvP,所以我们希望它对付费流量的消耗能控制在比较合理的水平,不希望打一局游戏就消耗几十兆的数据流量。

    图片

    而另一种同步策略是帧同步。

    这种技术应用的很广泛,最早的《星际争霸》《魔兽争霸3》都采用了帧同步,他们都基于局域网运行,网络的条件非常好,也不需要服务器就能搞定。帧同步的优点有几个:

    第一,它的开发效率比较高。如果你开发思路的整体框架是验证可行的,如果你把它的缺点解决了,那么你的开发思路完全就跟写单机一样,你只需要遵从这样的思路,尽量保证性能,程序该怎么写就怎么写。

    比如我们以前要在状态同步下面做一个复杂的技能,有很多段位的技能,可能要开发好几天,才能有一个稍微过得去的结果,而在帧同步下面,英雄做多段位技能很可能半天就搞定了。

    第二,它能实现更强的打击感,打击感强除了我们说的各种反馈、特效、音效外,还有它的准确性。利用帧同步,游戏里面看到这些挥舞的动作,就能做到在比较准确的时刻产生反馈,以及动作本身的密度也可以做到很高的频率,这在状态同步下是比较难做的。

    第三,它的流量消耗是稳定的。大家应该看过《星级争霸》的录像,它只有几百K的大小,这里面只有驱动游戏的输入序列。帧同步只会随着玩家数量的增多,流量才会增长,如果玩家数量固定的话,不管你的游戏有多复杂,你的角色有多少,流量消耗基本上都是稳定的。这点延伸开来还有一个好处,就是可以更方便地实现观战,录像的存储、回放,以及基于录像文件的后续处理。

    帧同步也有它的缺点。

    第一,最致命的缺点是网络要求比较高,帧同步是锁帧的,如果有网络的抖动,一段时间调用次数不稳定,网络命令的延迟就会挤压,引起卡顿。

    第二,它的反外挂能力很弱,帧同步的逻辑都在客户端里面,你可以比较容易的修改它。但为什么《王者荣耀》敢用帧同步,一方面是因为当时立项的时候开发周期很短,半年时间要做上线,要有几十个英雄,存在时间的压力,另一方面,MOBA类游戏不像数值成长类的游戏,它的玩法是基于单局的,单局的作弊修改,顶多影响这一局的胜负,不会存档,不会出现刷多少钱刷多少好的装备的问题,而且作弊之后我们也很容易监测到,并给予应有的惩罚,所以我们认为这不是致命的缺点。

    第三,它的断线重回时间很长,相信台下也有很多王者玩家,也曾碰到过闪退以后重回加载非常长的情况,甚至加载完以后游戏也快结束了,这是帧同步比较致命的问题。

    第四,它的逻辑性能优化有很大的压力。大家应该没有见到哪一款大型游戏是用帧同步来做的,因为这些游戏的每一个逻辑对象都是需要在客户端进行运算的。如果你做一个主城,主城里面有上千人,上千人虽然玩家看不到它,但游戏仍然需要对他们进行有效的逻辑运算,所以帧同步无法做非常多的对象都需要更新的游戏场景。

    图片

    那么我们为什么选择了帧同步而放弃了状态同步呢?

    我们前面提到它两个优点缺点是相对的,这边的优点对于那边来说就是缺点。对于我们手游立项的时候,最重要就是时间。当时市面上正在开发的MOBA手游不止王者一款,大家都在争上线的时间,所以我们要选择一个开发周期最短的方案。

    然后我们做端游的时候也有一个深刻的体会,如果要做有趣的英雄,有趣的技能,它在状态同步上面很难调出一个比较满意的效果。所以最后我们依然选择帧同步的方案。

    现在来看,选择帧同步方案之后,我们再把它的缺点进行优化或是规避,之后它带来的好处是非常明显的。《王者荣耀》重除了英雄的设计以及技能的感觉,还有很重要的一点,就是它确实在做一些非常有特色的英雄,它的技能、反馈、体验上面都做得不错,这些都是基于帧同步技术方案带来的优势。

    图片

    我们选择了方案之后,当时觉得很high,觉得这样一个技术方案开发起来得心应手,效率如此之高,做出来的效果也很好。

    但事实上,它也有好的一面,也有坏的一面,技术测试版本上线后质量不好,其中技术层面遇到的问题就是下面这三座大山。

    第一是同步性,同步性这块容易解决,其实也解决了;

    第二也是最大一块网络问题,帧同步它的网络问题导致我们对它技术方案的原理没有吃透,碰到了一些问题,那时候游戏的延迟很重,画面卡顿,能明显感觉走路抖动的现象;

    第三是性能问题,这个问题始终存在,我们也一直在优化。

    图片

    第一座大山,最容易解决的同步问题。

    帧同步的技术原理相当简单,10、20年前在应用这种技术了,从一个相同初始的状态开始,获得一个相同的输入,往下一帧一帧执行,执行时所有代码的流程走得都是一样的,这个结果调用完了以后,又有一个新状态,完成循环。相同的状态,相同的流程,不停的这样循环下去。

    这个原理虽然简单,但是你要去实现它的时候,还是会有很多坑。

    图片

    右边写的是实现要点,这是我们在解决第一座大山经验的总结,也是我们实际开发过程当中做的事情。

    首先,我们所有的运算都是基于整数,没有浮点数。浮点数是用分子分母表达的。

    其次,我们还会用到第三方的组件,帧组件也要需要进行一个比较严格的甄别。我们本身用的公司里面关于时间轴的编辑器里面,最初也是是浮点数,我们都是进行重写改造的。

    再次,很多人初次接触帧同步里面的问题,就是在写逻辑的时候和本地进行了关联、和“我”相关,这样就导致不同客户端走到了不同的分支。实际上,真正客户端跟逻辑的话,要跟我这样一个概念无关。

    接下来还有随机数,这个要严格一致。这是实现的要点,严格按照这上面的规则写代码还是有可能不同步,本身就很难杜绝这样的问题。

    最后,真正重要的是开发者要提升自己发现不同步问题的能力,什么时候不同步了,不同步你还要知道不同步在什么点,这是最关键的。你需要通过你的经验和总结提升这样的能力。这个能力还是通过输出来看不同客户端不同输出,找到发生在什么点。

    比如在《王者荣耀》里,我们看到不同步的现象应该是这样,有人对着墙跑,你看到的和别人玩的游戏是不一样的,就像进入平行世界。

    最开始测试《王者荣耀》的,我们希望不同步率达到1%,就是100局里面有1局出现不同步,我们就算游戏合格,但实际上对于这么大体量游戏来说,这个比率是有问题的,经过我们不停的努力,现在已经控制在万分之几,一万局游戏里面,可能有几局是不同步的。

    这个问题不一定是代码原因或者没有遵循这些要点才出现的,有可能是你去修改内存,你去加载资源的时候,本地资源有损害或者缺失,或者是异常。说白了,你没有办法往下执行,大家走了不同分支,这都可能引起最终是不同步的。

    如果你不同步概率比较低,到了这种万分之几概率的时候,很难通过测试来去还原,去找到这样不同步的点。

    最开始我们游戏出现不同步的时候,就是在周末玩家开黑多的时候,随着你的概率越来越低,基本上你就自己就还原不出这些问题了,只能依靠玩家帮你还原这样的场景,来分析这样的不同步问题。

    同步性遵循这样的要点,按照这样的思路来写,加上你不同步定位的能力,有了监控手段能够去发现,这个问题其实就解决了。解决之后,你就可以好好享受帧同步的开发优势。

    图片

    第二座大山就是网络,《王者荣耀》技术测试版本出台的时候,延迟非常大,而且还是卡顿,现在看一下帧同步里面比较特别的地方。帧同步有点像在看电影,它传统的帧同步需要有buffer,每个玩家输入会转发给所有客户端,互相会有编号,按顺序输入帧。

    比如我现在已经收到第N帧,只有当我收到第N+1帧的时候,第N这一帧我才可以执行。服务器会按照一定的频率,不同的给大家同步帧编号,包括这一帧的输入带给客户端,如果带一帧给你的数据你拿到之后就执行,下一帧数据没来就不能执行,它的结果就是卡顿。

    网络绝对理想的情况下还好,但现实的网络环境不是这样的。帧同步要解决问题就是调试buffer,以前有动态的buffer,它有1到n这样的缓冲区,根据网络抖动的情况,收入然后放到队列里面。

    这个buffer的大小,会影响到延迟和卡顿。如果你的buffer越小,你的延迟就越低,你拿到以后你不需要缓冲等待,马上就可以执行。但是如果下一帧没来,buffer很小,你就不能执行,最终导致的结果你的延迟还好,但是卡顿很明显。

    如果调到帧同步的buffer,假如我们认为网络延迟是1秒,你抖动调到1秒,那得到的结果虽然你画面不抖动了,但是你的延迟极其高。如果连最坏的网络情况都考虑进去,buffer足够大,那么记过就跟看视频是一样的,平行的东西,看你调大条小。一些局部的措施我们都做过,都是一样的问题。

    具体我们怎么优化卡顿的问题呢?

    刚才提到该帧同步与buffer,这个buffer可以是1也可以到n,我们要解决我们的延迟问题,我们就让buffer足够小。事实上《王者荣耀》最后做到的buffer是零,它不需要buffer,服务器给了我n,马上知道是n,我收到n,我知道下一次肯定是n+1,所以我收到n之后马上就把n这一帧的输入执行了。

    那么为什么不卡顿了,画面不抖动了?

    最后一个关键点,是本地插值平滑加逻辑与表现分离。客户端只负责一些模型、动画、它的位置,它会根据绑定的逻辑对象状态、速度、方向来进行一个插值,这样可以做到我们的逻辑帧率和渲染帧率不一样,但是做了插值平滑和逻辑表现分离,画面不抖了,延迟感也是很好的。

    做了这些后,我们还把TCP换成UDP,在手机环境下,弱网的情况下,TCP很难恢复重连,所以最后用了UDP来做。整体来说,在网络好的情况下,它延迟也是很好的,在网络比较差的情况下做插值,也是传统CS的表现。

    我们经常见到角色A和B,有些客户端A在左B在右,有些是A在右B在左,帧同步逻辑上面AB之间的距离和坐标都是完全一样,但是画面上看到他们可能会不重合,那就是你把它们分离之后的表现。网络极其好的情况下,它应该是重合的,但是在网络差的情况下,可能会有些偏差。这里面是最重要的一块优化。

    图片

    第三座大山,是我们对性能的优化。

    本身帧同步逻辑上面在优化上面存在一些缺点,所有的角色都需要进行运算。这方面我们也是借助Unity的特性,如果你想追求性能上的极致,有些东西你需要寻求好的方式。

    第一点是热点的处理。

    我们是不用反射的,它都有GC性能开销,我们的做法里面,会把对象的显示隐藏放在不同的渲染层里面,尽量让整个游戏帧率是平滑的过程。还有我们本身有自己的系统,比如AI,在《王者荣耀》这样的多角色游戏中,你如果想要做出比较好的体验,那么AI就要做得比较复杂。

    而要去优化热点,我觉得就只有这三个步骤可以走。

    首先,从程序的结构上面能找到更优的,它的优化效果就是最明显的其次,如果你的结构都是用的最好,就去挖掘局部的算法,调整你代码的一些写法。最后,如果局部的算法都已经调到最优还是没有什么办法,那只有一条路,就是牺牲整个质量,就是分帧降频。

    第二点是GC这块刚才说不用反射,还有装箱和拆箱的行为也是尽量少用。Unity指导过我们的优化,从GC上面的考虑,他们建议每一帧应该在200个字节以内是比较好的状态,其实很难做到,王者也是每一帧在1k左右,很难做到200。

    第三点是Drawcall,这些传统的优化手段大家都用的很熟了。

    第四点是裁剪,帧同步里面是不能裁剪的,表现里面我看不到的可以降低频率或者不更新它,这在表现里面可以做的。

    第五点是3DUI的优化,比如《王者荣耀》的血条、小地图上面叠的元素等等,这些UI都比较丰富,这块我们用了31UI的方式来优化,没有用UGUI里面进行血条方面的处理。

    我们也牺牲了一些东西,我们把所有东西都加载了,在游戏过程当中,我们希望不要有任何IO行为,包括输出我们都是要布局的。你处理的决策和复杂度,如果在一帧里面放出100颗子弹,在放100颗子弹的时候一定要掉帧的,一定要在力所能及的时候把这些东西做到极致。

    图片

    上面提的是我们的第一代,也是在去年5月份以前做的优化方案。5月份以后,我们还做了另外一件事情:GameCore。

    首先,为什么我们觉得iOS比安卓的优化效率高一些,一方面是iOS的CPU架构包括系统确实都优化的比较好,另一方面我们用的Unity4.6,在IOS下面它本身效率高一些,在安卓端的机器各种各样,性能也是千差万别,我们只能用性能比较差的方式。

    因为我们已经做到逻辑和表现的分离,那么我们能不能把逻辑独立出来,做成一个C++的东西,实际上我们在去年开始已经在这样做了。做之前也测试过C++和Mono性能的差别,大概是2.5左右,本身我们的逻辑占比游戏消耗20%多,逻辑不是一个大头,我们做了这件事情之后,还是有效的,帧率提升了2到3帧,花的时间很长。

    其次,做GameCore以后最明显的变化是我们以前逻辑上的GC没有了,我们有自己内存的管理、对象的管理,包括里面所有的容器类这些东西都是我们自己实现的,包括反射整个一套。它有了自己的内存管理,本身的效率就会比较高,这就已经是一个比较明显的优势了。

    再次,有了GameCore之后,又多了很多应用场景,这个东西就是玩法的服务器版本,应用场景运行服务器要做很多的分析,还有第三方使用都是可以的。

    最后,GameCore还有可以扩展多线程的潜力。

    图片

    今后,我们也有几个计划。

    第一,我们考虑能不能在热更新上面有所突破。因为王者这样一个游戏类型,包括它的体量,我们对于性能有一个比较极致的追求,不会轻易使用脚本层面在性能层面本身就不是最好的。这个我们要去研究的就是热更新,性能最好的方式。

    第二,我们也在和硬件厂商沟通,他们希望游戏能够真正发挥多核性能上的优势,大部分的游戏在单核上面,把一个核吃的满满的,很多时候我们现在得出的结论,GPU性能也很强,王者并没有对GPU占满,可能只用了30%,CPU反而吃的比较满,吃满以后它还有另外一个坏处,它的发热、降频,你如果用多线程、多核去尽量平坦,让它不要处于高频的工作方式,反而会有更好的效果。

    第三,我们现在用的是Unity 4.6版本,但Unity已经进化到5.7版了,后面他们还会推出新的特性,我们希望结合一些Unity新特性,现在已经有些游戏用5.6可以提升性能。

    最后,不光是提升性能问题,Unity在多线程的渲染,也有很好的作用,使用引擎优势也是很必要的。随着性能的提升,我们会对王者的画质进行升级。

    好的,我今天的演讲就到此结束了。

    图片

    https://mp.weixin.qq.com/s?__biz=MjM5OTc2ODUxMw==&mid=2649723567&idx=2&sn=ec946eef347c5768f05a67160f1dfe97&scene=21#wechat_redirect

    展开全文
  • 帧同步 状态同步

    千次阅读 2019-01-12 22:28:10
    农药自从上线以来,依靠着强大的产品力以及腾讯的运营能力,在游戏市场上表现可谓是风生水起,根据第方的调研数据显示,《王者荣耀》渗透率达到22.3%,用户规模达到2.01亿人,每日的日活跃用户(DAU)均值为5412.8...

    转载:https://my.oschina.net/u/1859679/blog/1137723

    农药自从上线以来,依靠着强大的产品力以及腾讯的运营能力,在游戏市场上表现可谓是风生水起,根据第三方的调研数据显示,《王者荣耀》渗透率达到22.3%,用户规模达到2.01亿人,每日的日活跃用户(DAU)均值为5412.8万人。 如此可观的数据,令人十分钦佩。

    当然了,作为技术人,更愿意从技术上了解去一些王者荣耀的实现原理和架构方式,从中找到新的知识领域,扩展自己的知识边界,丰富自己的专业技能。借助这个游戏,这一篇我们来聊一聊王者荣耀的技术实现以及同步方式,更多的从MOBA(多人在线战术竞争游戏)方向来解析推理王者的实现方案,如若有分析的不尽的方向,欢迎一起探讨改进。以下是主要讲解的几个重点:

    1. 服务器架构
    2. 通信方式
    3. 同步方案
    4. 技能同步
    5. 断线重连

     

    一、服务器架构

    不难发现,王者荣耀的服务器采用房间模式,每个玩家登陆以后,然后进入大厅,进行匹配游戏。匹配完成之后,把一起对战的玩家放到一个房间内进行对战。

    房间类玩法和MMORPG有很大的不同,在于其在线广播单元的不确定性和广播数量很小,而且需要匹配一台房间服务器让少数人进入一个服务器。

    这一类游戏最重要的是其“游戏大厅”的承载量,每个“游戏房间”受逻辑所限,需要维持和广播的玩家数据是有限的,但是“游戏大厅”需要维持相当高的在线用户数,所以一般来说,这种游戏还是需要做“分服”的。而“游戏大厅”里面最有挑战性的任务,就是“自动匹配”玩家进入一个“游戏房间”,这需要对所有在线玩家做搜索和过滤,以及为了更好的体验,会对玩家进行分地区进行匹配,以方便获得更快速的同步。

    一般的方式是玩家先登录“大厅服务器”,然后选择组队游戏的功能,服务器会通知参与的所有游戏客户端,新开一条连接到房间服务器上,这样所有参与的用户就能在房间服务器里进行游戏交互了。

     

    二、通信方式

    说到通信方式,一般会有http和socket 两种方式,但http底层也是采用socket,只是每次通信完成以后都会断开,这种方式对于需要频繁交互的双方来说,显得效率太低了,所以一般实时要求高的游戏都是采用socket方式来通信。

    可是sokect通信,又分为两种:TCP vs UDP,具体是采用那种socket类型,需要具体来看游戏游戏类型。以下是两种类型的优劣:

    从上面的对比中,我们可以会发现,关于socket,我们想做的事情,tcp都帮我们做了,我们只需要建立链接,然后像读写文件一样读写就可以了。而udp需要我们自己设计一切。看到这一切,你可能第一感觉就是采用tcp而非udp,那么真实情况是如此么?基于游戏的业务以及场景不同,我可以明确的告诉你,王者荣耀是采用udp的,包括腾讯多数长链接手游都是采用udp,这是为何?

    1、tcp保证数据可靠性是有代价的

    tcp能够保证数据包的可靠性和有序,这一切都帮你封装好了。TCP发送一个数据包,等待一段时间,直到检测到数据包丢失了,如果没有接收到它的ACK,接下来就重新发送丢失的数据包到目标计算机。重复的数据包将被丢弃在接收端,乱序的数据包将被重新排序。以此来保证数据包的可靠性和有序性。

    但为了保证可靠和有序,就要保证TCP无论什么情况,只要数据包出错,就必须等待数据包的重发。这是什么意思呐,就是说,即使最新的数据已经到达,但还是不能访问这些数据包,新到的数据会被放在一个队列中,需要等待丢失的包重新发过来之后,所有数据没有丢失才可以访问。

    如此,如果遇到网络环境太差或者不稳定,比如说国内的移动网络,或者是遭遇到了网络阻塞,出现一个数据包丢失,所有事情都需要停下来等待这个数据包重发。客户端会出现等待接收数据,玩家操作会出现卡顿以及响应不及时的现象。

    2、udp的可靠性—DIY手动组装

    从上面我们可以知道udp主要在可靠性上主要是不能保证数据包的顺序,比如第100个收到的数据包并不一定是第100个发出的数据包,同时也无法保证不丢包,期间有一个包丢失,udp本是也不会去校检。如果这两个问题解决了,udp的大部分可靠性问题也就解决了。

    具体的方案我们这一篇就不在细说,大体上是如此来解决:

    1、为每个数据包增加序列号,每发一次包,增加本地序号。

    2、每个数据包增加一段位域,用来容纳多个确认符。确认字符多少个,跟进应用的发包速率来觉得,速率越高,确认字符的数量也相应越多。

    3、每次收到包,把收到的包上序列号变为确认字符,发送包的时候带上这些确认字符。

    4、如果从确认字符里面发现某个数据包有丢失,把它留给应用程序来编写一个包含丢失数据的新的数据包,必要的话,这个包还会用一个新的序列号发送。

    5、针对多次收到同一包的时候可以放弃它

    三、同步方案

    游戏中常见的同步方案,有状态同步和帧同步,一般大型的MMOARPG都是采用的是状态同步,比如魔兽世界,状态同步采用C/S架构,所有的状态由服务器来控制,安全性比较高,但是流量比较大。帧同步采用的是囚徒模式,所有c端强制采用一个逻辑帧率,从而保证输出一致,其特点是流量小,安全性比较差。

    王者荣耀采用的就是帧同步,那么具体帧同步是什么,如何实现的,我们从两个地方来分解:

    1、帧率

    什么是帧率,可能没有做过client同学并不是很清楚这个术语,我们从一个小李子来讲解一下。我记得小时候有一种小人书,快速翻看就可以看到漫画上的人物会动起来。如下面这种:

    超过1M上传不删了,我也无奈

     

    由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候,就会认为是连贯的, 此现象称之为视觉暂留。这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的,就像上图快速翻小人书一样。

    游戏中的所有动画也是采用这种方式来渲染,只不过帧率是有GPU来控制,你所看到的画面都是有都是有GPU一帧帧渲染的,比如30帧/s,你所看到的画面就比较流畅了。而帧率越高你所看到的越流畅。

    2、Lockstep—帧同步

    帧同步可以说是通过帧率延伸过来的,你可以把一个游戏看成一个巨大的状态机,所有的参与者都采用同一个逻辑帧率来不断的向前推进。

     

    我们看如下2个图:

     

    图中是A、B、C三个玩家的时间轴,这个时间轴不是电脑上的本地时间,而是A、B、C联机时定义的一个时间轴。虚线分隔出来时间片称为turn,可以理解成一帧。箭头表示该玩家将自己的操作指令广播给其他玩家。

    我们把一盘游戏看成一个大型的状态机,因为大家玩的是同一款的游戏,因此F是相同的,初始状态S0也是相同的。在第一个turn结束时,所有玩家都接收到了完全一样的输入I,注意这里的I不是一个值,而是包含了当前游戏中所有玩家的操作指令集合。t1时刻所有玩家的电脑自行计算结果。由于F、S0和I是固定的,所以每个玩家电脑上计算出的下一个状态S1一定是相同的。

    所以通过上面我们可以知道:

     

    1、我们把游戏的前进分为一帧帧,这里的帧和游戏的渲染帧率并不是一个,只是借鉴了帧的概念,自定义的帧,我们称为turn。游戏的过程就是每一个turn不断向前推进,每一个玩家的turn推进速度一致。

     

    2、每一帧只有当服务器集齐了所有玩家的操作指令,也就是输入确定了之后,才可以进行计算,进入下一个turn,否则就要等待最慢的玩家。之后再广播给所有的玩家。如此才能保证帧一致。

     

    3、Lockstep的游戏是严格按照turn向前推进的,如果有人延迟比较高,其他玩家必须等待该玩家跟上之后再继续计算,不存在某个玩家领先或落后其他玩家若干个turn的情况。使用Lockstep同步机制的游戏中,每个玩家的延迟都等于延迟最高的那个人。

     

    4、由于大家的turn一致,以及输入固定,所以每一步所有客户端的计算结果都一致的。

    我们来看看具体的执行流程:

     

    上图中我们可以明显看到,这种囚徒模式的帧同步,在第二帧的时候,因为玩家1有延迟,而导致第二帧的同步时间发生延迟,从而导致所有玩家都在等待,出现卡顿现象。

    四、乐观锁&断线重连

    囚徒模式的帧同步,有一个致命的缺陷就是,若联网的玩家有一个网速慢了,势必会影响其他玩家的体验,因为服务器要等待所有输入达到之后再同步到所有的c端。另外如果中途有人掉线了,游戏就会无法继续或者掉线玩家无法重连,因为在严格的帧同步的情况下,中途加入游戏是从技术上来讲是非常困难的。因为你重新进来之后,你的初始状态和大家不一致,而且你的状态信息都是丢失状态的,比如,你的等级,随机种子,角色的属性信息等。 比如玩过早期的冰封王座都知道,一旦掉线基本这局就废了,需要重开,至于为何没有卡顿的现象,因为那时都是解决方案都是采用局域网的方式,所以基本是没有延迟问题的。

    后期为了解决这个问题,如今包括王者荣耀,服务器会保存玩家当场游戏的游戏指令以及状态信息,在玩家断线重连的时候,能够恢复到断线前的状态。不过这个还是无法解决帧同步的问题,因为严格的帧同步,是要等到所有玩家都输入之后,再去通知广播client更新,如果A服务器一直没有输入同步过来,大家是要等着的,那么如何解决这个问题?

    采用“定时不等待”的乐观方式在每次Interval时钟发生时固定将操作广播给所有用户,不依赖具体每个玩家是否有操作更新。如此帧率的时钟在由服务器控制,当客户端有操作的时候及时的发送服务器,然后服务端每秒钟20-50次向所有客户端发送更新消息。如下图:

    上图中,我们看到服务器不会再等到搜集完所有用户输入再进行下一帧,而是按照固定频率来同步玩家的输入信息到每一个c端,如果有玩家网络延迟,服务器的帧步进是不会等待的,比如上图中,在第二帧的时候,玩家A的网速慢,那么他这个时候,会被网速快的玩家给秒了(其他游戏也差不多)。但是网速慢的玩家不会卡到快的玩家,只会感觉自己操作延迟而已。

    五、技能同步

    游戏中有很多是和概率相关的,比如说技能的伤害有一定概率的暴击伤害或者折光被击等。按照帧同步的话,基于相同的输入,每个玩家的client都是独立计算伤害的,那么如何保证所有电脑的暴击伤害一致那。这个时候就需要用到伪随机了。

    大部分编程语言内置库里的随机数都是利用线性同余发生器产生的,如果不指定随机种子(Random Seed),默认以当前系统时间戳作为随机种子。一旦指定了随机种子,那么产生的随机数序列就是确定的。就是说两台电脑采用相同的随机种子,第N次随机的结果是一致的。

    所以在游戏开始前,服务器为每个玩家分配一个随机种子,然后同步给client,如此每个client在计算每个角色的技能时候,就能保证伤害是一致的。这也是多数帧同步游戏采用的方案,包括王者荣耀。

    展开全文
  • 帧同步,帧同步是什么意思

    千次阅读 2019-04-08 12:57:45
    帧同步,帧同步是什么意思 在数字通信时,一般总是以一定数目的码元组成一个个的“字”或“句”,即组成一个个的“群”进行传输的。因此,群同步信号的频率很容易由位同步信号经分频而得出。但是,每群的开头和末尾...
  • 一、帧同步原理: 帧同步,指的是将游戏过程中关键的操作帧数据同步给各个客户端实现游戏同步的方案。这原理看上去一句话很简单,但是其实内部涉及的细节却很多,影响到游戏的卡顿,同步是否完全同步等问题,接...
  • 帧同步和状态同步区别

    千次阅读 多人点赞 2020-09-14 11:26:28
    一、同步 所谓同步,就是要多客户端表现效果是一致的,例如我们玩王者荣耀的时候,需要十玩家的屏幕显示...最大的区别就是战斗核心逻辑写在哪,状态同步的战斗逻辑在服务端,帧同步的战斗逻辑在客户端。战斗逻辑是
  • 基于FPGA的帧同步设计

    千次阅读 2019-07-21 10:01:02
    要求开机后整个系统要能很快地进人帧同步,或一旦帧失步后,能很快恢复帧同步。帧失步将使信息丢失,对于语音通信来讲,人耳不易察觉出小于100 ms的通信中断,所以一般认为帧同步恢复时间在几十毫秒量级是允许的。...
  • 帧同步优化难点及解决方案

    万次阅读 2018-08-07 18:22:22
    这是侑虎科技第418篇文章,感谢作者Gordon供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群465082844) ... 作者也是U Sparkle活动参与者...帧同步这部分...
  • 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏。 其基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务器; 2.服务端将这些操作指令集保存到对应帧序列字典,并记录帧...
  • Unity帧同步,UDP,TCP

    千次阅读 2022-02-11 10:12:35
    帧同步基本流程 四、帧同步用UDP如何克服缺点 总结 前言 Unity3D实现帧同步 一、帧同步是什么? 单机游戏:手柄操作输入给程序,程序计算,推动游戏运行; 帧同步:所有的游戏逻辑都是在客户端计算,...
  • 所谓帧同步(lockstep),其实是同步操作,确保两客户端逻辑一致,然后服务器接收每客户端操作(cmd), 然后再下发下去,相同的逻辑,相同的操作,便会播放(DoAction)相同的结果。 如何保证同步 1.一样...
  • 同步的概念 同步技术是数字通信系统中非常重要的技术。一般来说数字通信系统要实现多种同步功能才能实现正确的数据通信任务。...同步问题在手机、雷达、WLAN、HDTV等都是很重要的。发送信号和接受...
  • 同时因为一些点书本内容太简略,所以参照学习了 GDC 2017 守望先锋对 ECS 架构涉及和网络同步的视频分享结合讲解加深理解。尝试提供所有必要基础知识理解游戏客户端预测(但是只是基础角度的分析,有需要深入学习的...
  • 数据链路层的三个基本问题

    万次阅读 2017-09-14 18:36:25
    今天我们主要讨论数据链路层的三个基本问题:封装成,差错控制,透明传输。 0x1数据链路层使用的两种信道 1.点对点信道 顾名思义,就是两台计算机一对一通信 2.广播通信 一台计算机发送消息,在网络上的所有主机...
  • 帧同步(LockStep)该如何反外挂

    千次阅读 2018-03-09 14:24:07
    目前参与了了一款动作射击的MOBA类游戏的开发,同步方案上选择了帧同步技术(LockStep而非snapshots以下同)。那么就有很多人担心起来,客户端会跑全部逻辑帧同步该如何反外挂,和状态同步有什么区别呢?首先我们来...
  • 一、同步 所谓同步,就是要多客户端表现效果是一致的,例如我们玩王者荣耀的时候,需要十玩家的屏幕显示的英雄位置...最大的区别就是战斗核心逻辑写在哪,状态同步的战斗逻辑在服务端,帧同步的战斗逻辑在客户端.
  • 还有一个问题是反作弊,对于 RTS 和帧同步的方案,只需要定时服务器(或者某个客户的托管服务器,或者大家)校验一下就行了,但是这只是防止了数据作弊,对于信息泄漏的话可能无解,因为运算和所有数据都在客户端...
  • 参考解密:腾讯如何打造一款实时对战手游从《王者荣耀》来聊聊游戏的帧同步《王者荣耀》技术总监复盘回炉历程:没跨过这座大山,就是另一款MOBA霸占市场了 纵观AppStore畅销榜前十的游戏,过半都支持玩家实时的...
  • 前言:网络同步属于游戏开发中比较重要且复杂的一部分,但是由于网上的资料内容参差不齐,很多人直接拿别人的结论写文章,导致很多人对这一块的很多概念和理解都是错误的。本文参考了大量的相关论文和...
  • 串口通信的帧同步问题

    千次阅读 2015-10-31 17:32:28
    封装STM32串口的底层时,遇到了串口帧同步问题。虽然以前也遇到类似场合,写出来的代码基本能够解决问题,但是在逻辑上总是不能彻底的解释一些细节。 讲一下当前的需求: 由于代码想用在一简单的PID闭环上,做...
  • 数据链路层—三个基本问题

    千次阅读 2015-11-24 17:47:02
    本文主要介绍数据链路层传输数据需要注意的最基本三个问题  当我们需要传输数据的时候,我们应该这考虑:首先,将数据封装成是数据链路层的基本单位),考虑去怎么封装,才能让接受端识别一个完整的,...
  • 翻译:张乾光(星际迷航) 审校:陈敬凤(nunu) 大家好,我是格伦·菲德勒。欢迎大家阅读系列教程《网络物理仿真》,这系列教程的目的是将物理...具有确定性的帧同步是一种用来在一台电脑和其他电脑之间进行同步
  • 终于要写帧同步这块了,这块很难讲清楚,细枝末节有很多优化点,也有一些不同的优化方向,根据不同项目类型,对操作手感的要求,对联机玩家的个数等,会有不同的难点和痛点。不同的优化方向,优化手法的差异,可能...
  • 王者荣耀的帧同步机智

    千次阅读 2017-07-05 17:25:51
    2、从《王者荣耀》来聊聊游戏的帧同步 3、游戏服务器的架构演进 农药自从上线以来,依靠着强大的产品力以及腾讯的运营能力,在游戏市场上表现可谓是风生水起,根据第方的调研数据显示,《王者荣耀》...
  • 本章介绍的数据链路层分为...2,数据链路层的三个基本问题:封装成、透明传输和差错检测 3,以太网MAC层的硬件地址 4,适配器、转发器、集线器、网桥、以太网交换机的作用及使用场合 一,数据链路层的基本概...
  • 如今已经大获市场成功的《王者荣耀》一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前...据闪电站小猪了解,在8月之后的两月间,《王者荣耀》技术团队对这产品进行了非常深度的优化,并攻
  • 帧同步游戏的设计

    千次阅读 2016-10-19 22:20:44
    从单机游戏到网络游戏 单机游戏,这里指即时的动作类游戏,玩家输入操作,通过终端运算而进行的游戏。加入了多人网络以后,玩家的输入不仅仅只是在本地的终端上运算,还会通过...帧同步应该是引入多人网络以后,能想

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,135
精华内容 21,654
关键字:

帧同步的三个基本问题