网络游戏中移动同步问题解决方案.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络游戏中移动同步问题解决方案

网络游戏中移动同步问题解决方案   摘要:在基于C/S网络游戏架构下,介绍了网络游戏中的网络分布式对象的概念,分析了基于图形帧移动的错误方法,提出了一种基于时间移动的算法,并使用插值的方法改进了该算法。最后在上述基础上,提出了一种基于客户端预测和客户端修正的移动同步算法。在实时性要求较高的网络游戏中该算法完全能解决移动同步问题。??   关键词:网络引擎;网络游戏;同步;客户端预测;分布式对象??   中图分类号:TP391.9文献标志码:A   文章编号:1001-3695(2007)05-0207-03      0引言??      目前网络多人在线游戏主要有以下两种典型的网络拓扑方式:一是C/S模式,即所有的网络数据都必须从一个客户端到一个服务器,然后又由服务器中心转发到其他客户端上;二是Peer-to-Peer模式,Peer-to-Peer游戏没有专门的服务器。在Peer-to-Peer世界中,每个客户端都要与其他客户端进行网络通信[1]。??   在基于C/S架构的网络多人在线游戏中,服务器通常扮演着重要的角色,它主宰着整个游戏世界,负责游戏规则的判定,并处理客户端传来的玩家输入。客户端和服务器以极高的速率发送数据量很小的数据包进行通信。客户端接收当前在服务器上整个游戏世界的状态,并通过该状态产生视/音频效果并展示给玩家,客户端也通过对输入设备(键盘、鼠标、游戏杆等)进行定时采样将采样信息发送给服务器作进一步的处理[2]。??   与单机游戏相比,网络游戏需要处理许多新的问题,如带宽、网络延迟、网络丢包问题等。这些问题均会导致网络同步,特别是在实时性很高的第一人称射击游戏中,网络同步问题成了制约游戏性能好坏的关键因素。??      1网络同步中的关键技术??      1.1网络分布式对象??   网络分布式对象在游戏网络引擎中非常重要,是多人网络游戏中必不可少的技术。该技术的大体思路是:如果一个对象一旦在一个客户端上被创建,则该对象也会在所有已经连接到服务器的客户端上被创建;如果一个对象在客户端上被销毁,则它就会在所有已连接到服务器上的客户端中被销毁[3]。??   为便于描述,笔者将在本地客户端上的对象定义为Player对象,非本地客户端上的相应对象定义为GhostPlayer对象;两个对象具有相同的操作,但可能具有不一致的数据。图1描述了两个客户端加入服务器后Player和GhostPlayer对象在网络中的分布情况。??   当创建好分布式对象后,就可以通过分布式对象上相应的网络接口(如RPC)进行对象到对象的通信,给编程人员的感觉如图1中的虚线路径:PlayerA(客户端A)到GhostPlayerA(客户端B);但实质上还是经过了以下的通信过程:PlayerA(客户端A) 到GhostPlayerA(服务器)到GhostPlayerA(客户端B)。??      1.2基于时间的移动??   游戏时间的安排非常重要[4]。一些编程者通常会把特定的硬件时间放置到游戏循环中,即他们可能根据帧计数器更新游戏,而不是根据所经历的实际时间来更新游戏。特别是在网络游戏中,保持基于时间的更新是保证各个客户端同步的基础。典型的错误方法如下:??   float t = 0.0f, TimeStep=0.01;??    while (!quit)??   {ProcessInput(t);…??Player.position.x=Player.position.x+5;?ぁ???   MoveObject(t);??   Render(state);??   t += TimeStep;??   }??   在上述代码中,每次游戏的更新都会使玩家在??x??方向上移动五个单位。假设有一个CPU为1 GHz的计算机,由游戏循环的处理将消耗计算机1/60 s的时间可知, 1 s内游戏将更新60次,这将会使玩家移动300个/s单位;如果一个计算机的CPU频率为2 GHz,那么游戏将以帧率为120 fps的速度运行,即两倍于前者计算机的帧速运行这个游戏,这将使玩家移动600个/s单位。如果他们是网络上的对手,那么后者将能以两倍于前者的速度在游戏世界中移动。??   上述方法显然是错误的,因此需要一种基于时间移动的算法。目前的解决办法是:使用一个时间累计器(Accumulator),在每次更新时将每次游戏更新的时间间隔(DeltaTime)加到累计器上;当累计的时间大于TimeStep时就开始一次物理模拟,并将累计的时间减去TimeStep。该算法能保证游戏完全以TimeStep的时间步长进行游戏更新。下面是该算法的核心代码:??   float TimeStep=

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档