游戏引擎:游戏引擎剖析( 7)

原文作者:Jake Simpson
译者: 向海
Email:[email protected]


第7部份: 网络和连线游戏环境


网络游戏
  我记得些年前坐在GDC(游戏开发者大会)听负责开发X-Wing Vs TIE Fighter家伙们题为“淹没在Internet” 演讲全是有关让网络游戏实时地在Internet上工作东西他们选择那个题目是多么正确啊当它开始处理数据包丢失乱序潜伏(个数据包发送到它地所花时间)等等时它确实淹没了然而它是可能对于Internet需要些聪明和经验但它是肯定可能看看今天大量连线游戏从Quake IIIUnreal TournamentCounter Strike直到EverQuest和Ultima Online

  如今大多数真正有长久生命力游戏都至少有些连线成分最纯粹单人游戏容易玩也许两次或者甚至 3次如果它是非常好游戏旦游戏结束就被束的高阁了如果你想要有任何长久生命力那么多人连线游戏就是形势核心所在并且那意味着和Internet打交道为编码者打开了那个潘多拉盒子

  那么跟Internet打交道包括些什么呢?首先是要理解Internet是如何工作和点对点和客户机/服务器体系结构快速讨论点对点就是你在两台机器上运行游戏并简单地在它们的间共享输入每个单独游戏假定它是正确并仅仅在它幀接刷新中合并来自另外台机器输入客户机/服务器是台机器有效地运行游戏机器仅仅是个终端接受来自玩家输入并渲染服务器让它渲染任何东西

  客户机/服务器优点是每台机器都将会展现相同游戏所有处理都在个地方完成没有跨越多台机器你可以不用考虑每台机器相互的间同步问题不足的处是服务器本身需要有些重要CPU可用时间来处理每个连接客户机个合适网络连接来确保每个客户机及时地接收到它更新


了解IP
  我们都已经听说过TCP/IP(传输控制协议/网间协议)和UDP(用户数据包协议) 在Web网络上有大量有关这些协议深奥技术资讯实际上在Cisco网站WebSite上有些极好TCP/IP指导我们将在较高层面上介绍些TCP/IP基本知识是让你更好地了解使用这些标准协议网络游戏设计者面临挑战

  TCP/IP和UDP/IP是两层通信协议系统IP层负责网际数据包传输UDP或者TCP层将大数据包传给IPIP将数据包分割为小子数据包为每个数据包加上个信封计算出目IP地址应该如何到达那里然后将数据包发送到你ISP或者不管怎样你连接到网络 这实在象是在张明信片上写下你要发送贴上邮票写上地址塞进个邮箱它就送走了

  UDP和TCP是从你编码者或者游戏接收数据包高层协议并决定该如何处理这些数据包UDP和TCP区别在于TCP保证数据包传送和有序而UDP不保证UDP是条直接和IP对话小路而TCP是在你和IP的间个接口它像是在你和你邮件的间有个管理员助手使用UDP你会自己为你信打字把它们放进个信封等等使用TCP你会仅仅向你管理员口授信稿管理员会做全部工作并追踪确认信件送到了

  然而所有这些令人惊奇为你完成工作伴随着代价为了确定数据包通过Internet完好无损地送到了目TCP期待从目方为它发送每个数据包发回个应答包(网络用语是ACK)如果它在定时间内没有收到ACK它就停止发送任何新数据包重新发送丢失数据包并且将继续这样做直到收到目回应当你访问个网页时我们都已经看到了这种情形在半途中下载停止了会然后又重新开始了可能是个数据包在什么地方丢失了(假定不时ISP问题)在任何更多数据包被发送以前TCP要求重新发送它

  这问题是在认识到出了差错发送者和实际上正在送达数据包的间出现了延迟有时这能花上数秒钟如果你仅仅只是下载个文件或个网页这不是什么大碍但如果这是个游戏数据包而且每秒至少有十次那么你真是遇到麻烦了尤其是它停止了其他切事情实际上就是这个问题所以几乎没有游戏选择使用TCP作为它们主要Internet协议除非它不是个实时动作游戏大多数游戏使用 UDP--他们不能保证有序或可靠送达但它确实很快—或者结果是至少通常比TCP/IP更快现在我们了解这些了接下来呢?


客户端预测
   UDP 明显是快速响应游戏方式我们将必须自己处理数据包丢失和乱序边而且这是窍门技巧所在不用说出太多代码秘密我就能说有思路方法作为开始有客户端预言个被谈论得相当多词语当你作为个客户端连接到个大服务器但是不能连贯地看见来自服务器更新客户端预言开始起作用了正在你电脑上运行游戏部分看着你正给它输入并在缺乏来自服务器任何弃绝信息情况下对它认为将继续进行事情作出‘最好猜测’它将会显示被猜测数据然后当它得到来自服务器世界最新状态时改正它自己如果需要你可能会对这个思路方法效力感到惊讶大体而言大部分时间数据包不容易丢失—大多数时候是几十分的这种情况下游戏没有太多时间偏离服务器实际上认为正在发生事情偏离确实会随着时间变比较大大多数游戏里面有个超时功能当出现很长时间没有来自服务器联络时就停止游戏

  你正在创造游戏类型在这里有关系 -- 第人称射击游戏不需要这样有效客户端预言它多数情况下仅仅处理“我在哪儿我是否要射击?”在第 3人称游戏中你必须更加精确因此你能够正确地预测你角色正在播放动画并且动作流畅在这种情形中流畅动画是完全必要Heretic II在这方面有很大问题并且是当它开始网络编码时Raven直不得不处理最困难事情的

  当然如果你有个很不错网络连接比如宽带连接那么这个问题就远没有那么重要对比较大数据包有个更宽管道对你网络连通时间更快速事实上宽带对于游戏主要优点不比较胖管道多但大大减少了延迟特别是你到ISP跳上对于56K 调制解调器跳典型延迟是100ms这已经严重地增加了你到网络上任意台游戏服务器潜在连通时间对于宽带连接比如像DSL延迟时间多半是20ms使用Windows中个叫做TraceRoute(TRACERT.EXE)命令行并指定个目标IP地址或者域名你能够找出你连通时间仔细观察第这几乎总是你到你ISP网络连通时间并且观察你在你ISP网络内部用了多少跳直到你看见在个给定跳上列出个区别域名

  请注意宽带并不总是能解决延迟问题你仍然受最慢路由器/服务器和数据包从服务器穿越网络到达你跳数(反的亦然)支配个宽带连接确实容易缓和这些但不可能它们最后就消失了当然如果你打算要运行某种服务器你将会需要个具有足够快速向上游数据速率带宽仅仅个调制解调器不能够处理个服务器产生负荷

  值得如果你想要在PS2或者Xbox上面玩网络游戏你将需要个宽带连接它们两者都不支持调制解调器


包大小智能数据传输和反作弊
  别必须被处理事情是数据包大小如果你在个游戏里面64个人都在跑来跑去相互攻击台机器发送到另外台机器数据包能变得相当大达到了些调制解调器没有带宽处理这些数据程度这正在变得特别和那些有着很大地表系统游戏有关这里增加问题是你有这个很好地表系统你能够看得很远因此能够看见许多其他游戏玩家使得你为了精确渲染所需要来自服务器数据数量以很快速率增长我们能做什么呢?

  好吧首先必要是只发送绝对必须东西给任何给定客户端因此他仅仅得到从他角度观察游戏所需要东西发送在他视野以外人们数据没有点意义—他将看不见这些同时你最好确保只发送那些每幀的间实际上发生改变数据如果个家伙仍然在播放相同动画重新发送数据没有意义当然如果数据包丢失时这确实带来些问题但这就是为什么好网络员被支付很多金钱来处理类似这样东西

  还有些其他事情也要处理最近已经有大量令人苦恼连线作弊正在发生这是某些人修改游戏以给他们不正当利益地方尽管严格意义上这不是网络部分但它确实发生了有时人们会创作些模块允许他们立即瞄准进入视野任何人或者简单地允许他们看穿墙壁或者让其他游戏玩家看不见他们自己大部份时间这些事情可以在网络层内部或者在服务器上被处理任何有100%命中率人被简单地踢出游戏在人力所及范围内那是不可能

  游戏开发者必须尽切可能制止作弊行为但很不幸人做东西可以被人突破所有你能做就是让作弊变得困难当确实发生时去尝试发现它

  好吧现在就到这里了在第8部分中我们将会看看游戏脚本系统趣味世界根据游戏过程中出现事件来渲染或使能预先定义场景和行为协助故事叙述
Tags:  游戏搜索引擎 游戏引擎启动异常 什么是游戏引擎 游戏引擎

延伸阅读

最新评论

发表评论