快节奏的多人游戏同步 - Part 1
发表于2017-01-13
介绍
这是系列的第一章,主要介绍快节奏游戏所用到的技术和算法。如果你熟悉多人游戏背后的概念,你完全可以跳过接下来介绍性质的内容。
开发任何一种游戏都是一项挑战,特别是多人游戏,有全新的一套问题需要解决。网络游戏的核心技术问题是作弊和通信。
作弊问题
作为游戏开发者,一般是不需要担心玩家在单机中作弊的,他的行为只能影响到自己。作弊者可能没法按照你设计的去体验,但这是他们的游戏,他们怎么做都行。
多人游戏就不同了。在任何竞技游戏中,作弊玩家不仅仅让自己体验更好而已,还让其他人体验更差。这回导致没人愿意继续玩,作为开发者,你肯定不想遇到这种情况。
防止作弊的方法有很多,但是最重要的方法(也很可能是唯一的方法)最简单:别信任玩家。永远假定最坏情况:玩家会作弊。
权威服务器和傀儡客户端
这就有了一种看起来最简单的方法,让所有事情都在服务器发生并且受控。客户端只是受限的旁观者。换句话说,你的游戏客户端只是发送输入(按键、命令)到服务器,服务器运行游戏,然后将结果传回客户端。之所以叫权威服务器,是因为所有事情的发生都在服务器。
当然,你的服务器也会有漏洞,但这不在这系列文章的讨论范围。用权威服务器能够阻止大范围的破解行为。比如说,你不信任客户端的血量,但被破解的客户端可以本地修改血量到10000%,但服务器知道它实际只有10%。接下来玩家再被攻击就会死亡,不管客户端怎么破解。
你同样不信任玩家的坐标。如果这么做了,一个破解了的客户端会告诉服务器“我在(10,10)”接着下一秒会告诉服务器“我在(20,20)”,这就会让玩家穿墙或者跑得比其他人要快。相反,服务器知道玩家在(10,10),客户端会告诉服务器“我想往右边一点点”,服务器就会更新坐标到(11,10),然后告诉客户端“你在(11,10)”。
总的来讲,游戏状态只由服务器来管理。客户端会发送他们的行为到服务器。服务器定期更新状态,然后将状态发回去,客户端只要显示可以了。
处理网络
傀儡客户端对于回合制游戏来讲能良好工作,比如策略游戏或者扑克牌。它在局域网下也会有不错的表现,通信几乎是立刻到达。但这对于因特网上互联的快节奏游戏来讲是不可行。
这里算一下网速。假设你在旧金山,连接到纽约的服务器。这大概有4000km,也就是2500里(差不多等于里斯本到莫斯科)。没有东西能比光速快,就算是在互联网上的字节(微观上是光脉冲,在电缆中的电流,也就是电磁波)。光传播速度大约是300,000 km/s,所以穿越4000km需要13毫秒。
这可能听起来很快,但这是基于非常乐观的假设–这里假设了数据以光速在直线上传输,这几乎是不可能的事情。在现实生活中,数据需要经过一个个路由器跳跃,大多数都没有到达光速;路由器本身还存在一定的延迟,需要对数据包进行拷贝、检查、发送。
为了便于讨论,假设数据包从客户端到服务器需要50毫秒,这已经是很好的情况–如果你在纽约连接到东京会怎样?如果网络阻塞会怎样?100、200甚至500毫秒的延迟也不是没有的。
回到我们的例子,你的客户端发送输入信息到服务器“我按下右键”。服务器在50毫秒后收到。假设服务器处理请求并且马上回包。你的客户端会在50毫秒后收到“你在(1,0)”。
在你看来,所发生的事情无非就是按下右键有十分之一秒没有响应而已,接着角色才开始往右走。这个在你输入与结果之间的延迟听起来不是特别严重,但这会影响手感。如果延迟到了半秒钟,这就不仅仅是影响手感,而是这游戏没法玩了。
总结
网络多人游戏非常有趣,但是带来了全新的挑战。权威服务器架构能解决大部分作弊问题。简单的实现方式能让游戏没有响应性。
在接下来的文章里,我们将会基于权威服务器去构建系统,同时会去最小化延迟给玩家带来的不良体验,让玩家感受到单机游戏般顺畅。
英文原文链接: http://www.gabrielgambetta.com/fpm1.html