原文地址:Fast-Paced Multiplayer (Part I): Introduction

简介

这是一系列的关于快速多人游戏的技术和算法的文章的第一篇,如果你对于多人游戏背后的技术非常熟悉,那么你可以直接跳到下一篇 - 因为接下来的内容只是介绍性质的。

每一种游戏的开发技术都有各自的难点,多人游戏则给游戏开发添加了一系列要处理的问题,有趣的是,其中最核心的问题是让人看上去自然和物理模拟。

关于作弊的问题

所有的一切的起源都是作弊。

作为一个游戏开发者,你一般不会去担心有人在你的单人游戏中去作弊 - 因为他的行为不会给其他人带来影响,一个作弊的玩家可能并不会按你设计的套路去进行游戏,但是游戏是他的,他们有权利去选择怎么去玩。

多人游戏则不同。在任何的有竞争关系的游戏中,一个作弊玩家不仅仅给自己带来了更好的体验,他也毁了其他的玩家的游戏。作为开发者,你可能希望避免出现这样的情况,因为这会让玩家流失。

为了防止作弊,有很多事可以去做,但是最重要最(可能也是唯一有意义的)的事非常简单:不要相信玩家。就做最坏的打算:所有玩家都想要作弊。

权威服务器和静默客户端

有一个非常简单的解决方案 - 你将游戏中所有的逻辑都放在你控制的服务器来做,而客户端只是游戏的旁观者,换句话说,你游戏的客户端把输入(按键,命令)发送到服务器,服务器来运行这个游戏,然后你把结果返回给客户端。这就是常说的权威服务器,因为游戏世界中发生的一切都在服务器中进行。

当然,你的服务器还是可能被发现漏洞,但是这就不属于我们要谈论的范围了。使用权威服务器可以防止很多的漏洞,比如,服务器不信任玩家的在客户端的血量,客户端想要作弊,把本地的血量调到10000%,但服务器知道血量只有10% - 当玩家被攻击的时候它还是会死掉,不管客户端的血量是多少。

服务器同样不信任玩家的位置。你可能会这样做,在这一秒你告诉服务器“我在(10,10)”,然而下一秒你告诉服务器“我在(20,10)”,这样就可以穿过一堵墙或者超快速的移动。但是,权威服务器知道玩家在(10,10),当客户端告知服务器他要往右动一格的时候,客户端的位置会由服务器来处理,将位置更新为(11,10),然后告知玩家“你在(11,10)”。如下图所示:

一个简单的CS交互

小结:游戏的状态由服务器独自管理。客户端将动作发送给服务器,服务器来周期性地更新游戏状态,然后将新的游戏状态发送给客户端,客户端对结果进行渲染呈现。

处理网络

上面的处理方式对于回合制的游戏非常适合,比如策略游戏或者棋牌类的游戏。它在LAN中也能工作的很好,在这种情况下,通信是瞬发的。但是对于一些对实时性要求很高的游戏,而且在internet环境中,这种解决方案就会出问题了。

下面来谈一些物理的问题。假如你在旧金山,连接了一个在纽约的服务器,两地相距4000km或者2500英里(大概是里斯本到莫斯科的距离)。任何东西都不能比光快吧,即使是Internet上的数据(数据传播的底层可能是光的脉冲,线缆中的电子,或者是电磁波),光传播的速度大概是300000km/s,所以传播4000km需要13ms。

这听起来可能很快,但这实际是最乐观的情况 - 假设数据传播的速度是光速,沿着直线传播,这些通常是不可能的。在真实情况下,数据是由无数个路由经过一系列的跳(在计算机网络里的属于叫做hops)进行传播的,而且大部分的传播速度都达不到光速;路由在传播的时候也会产生一些延迟,因为包必须被打包,检查和分发。

所以保险起见,我们假设数据从客户端到服务器需要50ms,这接近最好的场景了 - 当你在纽约而服务器在东京呢?假设网络因为什么原因发生阻塞了呢?100ms,200ms,500ms的延迟也是有可能的。

回到我们的例子,你的客户端将输入“我按下了向右的按键”发给服务器,服务器在50ms之后获取了数据,现在假设服务器能够立即响应并且将结果返回,那么客户端在50ms之后获得新的游戏状态“你现在在(1,0)”。

从你的视角来看,情况是这样的:你按下了向右的按键,但是什么事都没发生,直到一百年后你的角色向右移动了一格。这样的延迟是显而易见的,当然延迟半秒不仅仅是显而易见,它让整个游戏没法玩了。

总结

通过网络连接的多人游戏是超级有趣的,但是引入了一系列的难题和挑战。权威服务器架构能够防止很多的作弊,但是直接用这种方法会让游戏的响应变得迟缓。

在下面的文章,我们会介绍我们怎么围绕权威服务器来建立一个系统,能够最小的减少玩家的延迟体验,就像在玩单机游戏一样顺畅。

快速多人游戏(1) - 介绍相关推荐

  1. 快速多人游戏(4) - 爆头!(AKA延迟补偿)

    原文链接:Fast-Paced Multiplayer (Part IV): Headshot! (AKA Lag Compensation) 介绍 从上一篇文章到现在已经过了很久很久了(整整两年!哦 ...

  2. 拨测工具_您可以拨多少钱? 快速简单地介绍有用的工具。

    拨测工具 by Miguel Bustamante 通过Miguel Bustamante 您可以卷曲多少? 快速简单地介绍有用的工具. (How much can you cURL? A quick ...

  3. ArcGIS快速制图插件介绍

    ArcGIS快速制图插件介绍 By 李远祥 作品背景 <快速制图插件增强版>在原有的<快速制图插件>基础上,加入植被乱序填充.生成立体楼快.等高线增强显示.一键导出地图和数据. ...

  4. tera服务器不显示,tera无法登陆怎么解决_tera无法登陆的快速解决方法介绍

    tera无法登陆有哪些解决办法?下面小编为大家详细介绍. 一.帐号或密码错误 1.症状: 2.登陆器提示账号或密码错误. 3.原因: 4.未使用正确的账号和密码进行登陆. 解决方法 请查看您是否使用正 ...

  5. etabs数据_ETABS 快速建模技巧介绍.pdf

    结构分析与设计软件ETABS 知识选讲(一) ETABS 快速建模技巧介绍 沈万湘 李立 北京金土木软件技术有限公司 使用结构分析与设计软件时,建立分析 安装目录下的Default.edb 文件中的信 ...

  6. fastboot快速引导模式 介绍

    fastboot 快速引导模式 介绍 Fastboot 是一种在 Android 设备上启动引导程序的方式.通过 Fastboot,您可以在设备的引导分区中刷入镜像文件.格式化分区.解锁引导加载程序等 ...

  7. linux locate 快速查找命令介绍

    时间过得好快,一转眼一年又快到过年了,很久没有和大家分享了,工作实在太忙了. 使用linux的人都会知道find查找命令. 下面有关于find的使用说明 :linux 查找命令大全. 下面给大家介绍一 ...

  8. 3DMAX快速入门 界面介绍【上】

    对3D软件感兴趣的你在打开3Dmax的那一刻,有没有傻眼?密密麻麻的格子让人看得眼花缭乱,为了避免你一打开就把软件关掉,从此就关上了3d这一款赚钱软件的窗户. 小锤就来和你介绍一下3dmax,让你对于 ...

  9. NW(New World)快速开发平台介绍(完整的中小型管理系统解决方案)

    在公司做了3年多的web平台开发,自己(和同事)总结了一套快速开发平台,定位于快速开发中小型的管理系统.NW开发平台是一个完整的解决方案,包括前端组件.权限.事务.dao.报表.vo生成器.eclip ...

最新文章

  1. ES6基础之Array.fill函数
  2. 对象是否要被回收(引用计数和可达性分析算法)
  3. 【算法分析与设计】DFS与BFS的区别
  4. CentOS7下使用yum安装MariaDB
  5. 四种有能力取代Cookies的客户端Web存储方案
  6. 解决Element的 InfiniteScroll 无限滚动组件报错
  7. 《Spring Boot极简教程》第9章 Spring Boot集成Scala混合Java开发
  8. 史上最详细解释接口自动化测试中cookie、session和token的区别【多测师_王sir】
  9. css td 宽度百分比设置,css怎么设置td的宽度
  10. cad编程c语言,基于C.NET的AutoCAD二次开发简版.pdf
  11. 需求分析-业务需求、用户需求、功能需求
  12. support vector regression(SVR)支持向量回归
  13. windows系统中如何新建桌面
  14. 写了个工具ArcGIS批量下载影像图!分享给大家
  15. android 生物识别_将生物识别提示与cryptoobject一起使用
  16. Python3,5行代码让电脑永不息屏。
  17. 文件下载及解决中文名乱码问题
  18. OpenGL-36-01SSAO
  19. java之I/O流【二】
  20. 企业如何与客户建立良好的客户关系

热门文章

  1. mysql unit类型_mysql入门-数据类型(二)
  2. 怎么搭建开发一款社交IM系统软件?
  3. 数字化转型对于创业者有何机遇?
  4. (笔记)关于spit截取表单提交数据区分符号中英文及正则判断
  5. 网络游戏发达的当下,企业社会责任很重要!
  6. 云台山风景区,春茶让景色变得更有生机
  7. 分享!微信自定义分享链接的标题(描述和图片)都是怎么实现的?
  8. 本地存储(Application)
  9. ​Kali-linux无线网络嗅探工具Kismet​
  10. java创建的zip无法打开或打开显示不可预料的压缩文件