快节奏多人游戏(1):客户端与服务器架构

介绍

这是探索使快节奏多人游戏成为可能的技术和算法的系列文章中的第一篇。下面只是一个介绍性的入门讨论,如果你已经熟悉多人游戏设计背后的理念,你可以跳到下一篇文章。

开发任何类型的游戏本身都是具有非常大的挑战性的。然而,多人游戏却增加了很多需要我们处理的新问题。有趣的是,其核心问题却是人性和物理!

作弊问题

多人游戏的一切都始于作弊。

作为一个游戏开发者,你通常并不关心一个玩家是否在一个买断制的单机游戏中作弊,你也不用关心他的行为是否会影响其他玩家。作弊的玩家可能无法完全按照你的计划去体验游戏,但是由于他们购买了游戏,所以他们有权以任何他们喜欢的方式玩游戏。

而多人游戏与单机游戏则恰恰相反。在任何有竞争性的游戏当中,玩家作弊的目的可能只是为了让自己更好,但往往这种作弊行为同时也会让其他玩家对游戏的体验变得更糟。作为开发人员,你必须避免这种情况的发生,因为只要有一个作弊玩家的存在往往会导致更多的其他玩家离去,最后你的游戏也会变得没有任何人玩。

有许许多多的防止游戏中作弊的方法,但其中最重要的一个(可能也是唯一有意义的一个)却很简单:不要相信玩家,总是假设最坏的情况–玩家会试图作弊。

权威的服务器和愚蠢的客户端

这里有一个看似很简单的解决方案:你可以让游戏中的所有内容都发生在你控制的中央服务器中,并使客户端成为游戏的特权观众。换句话说,你的游戏客户端将输入(按键、指令)发送到服务器,而服务器运行着游戏,并处理玩家的输入,把运行的结果发送回客户端。我们叫这种服务器为“权威性服务器”,因为服务器有权触发游戏时间中发生的任何事情。

当然,你的服务器可能会被某个漏洞利用,但这超出了本系列文章的范围。但是,使用权威的服务器可以防止各种各样的黑客攻击。例如,如果你不信任游戏中客户端的玩家HP的数值状态,当被客户端被黑客攻击并修改其本地的HP数值时,告诉服务器它的HP数值增加了10000%,但服务器其实是知道玩家血量只有1%,当受到其玩家攻击时,服务器就会判断其死亡,无论黑客对客户端做了任何修改都是徒劳无功的。

另外一个简单的例子中,对于玩家在游戏时间上的坐标位置。如果你让客户端告知服务器其所处的位置,那么如果受到黑客攻击,玩家上一秒在位置 (10, 10),一秒钟后可能就变成 (20, 10) 坐标的情况,玩家可能会很轻易就穿越一堵墙,或者跑的比其他玩家更快。相反,在一个权威的服务器中,如果让服务器知道玩家所处的位置,客户端告诉服务器“我想向右移动一个方格”,服务器用 (11, 10) 更新玩家位置的变化,并回复客户端“你现在的位置在 (11, 10)”。

fpm

总之,游戏状态仅由服务器来管理。客户端将操作发送给服务器。服务器定时更新游戏状态,然后将新游戏状态发送回客户端,客户端只是在屏幕上呈现更新后的状态。

网络传输

愚蠢的客户端方案在慢节奏的回合制游戏中会工作的很正常,例如战略游戏和扑克牌。它也适用于局域网,在所有实际应用中,通信都是即时的。但是,用游戏运用于互联网进行快节奏的游戏时,这一切都会被打破。

我们来谈谈网络中物理相关的知识。假设你在旧金山,连接到纽约的服务器,那是大约 4000 公里,没有什么东西能比光传输的更快,甚至互联网上的传输的字节(在较低级别是光脉冲,电缆中的电子或电磁波),光大约以 300000 km/s 的速度行进,因此传输 4000 公里大约需要 13 毫秒。

这可能听起来非常快,但它实际上是一个非常乐观的数据,它假设数据是以直线路径的光速传播的,但实际上很少有这种情况。在现实生活中,数据经历了路由器的一系列跳转,其中大多数都不是在光速中进行的,每个路由器自身也会引入一些延迟,因为数据包往往需要拷贝、校验以及重新路由等操作。

为了论证,我们假设从客户端到服务器的数据传输需要50毫秒,这可能是最佳的情况。但是如果你在纽约连接到东京的服务器会发生了什么呢?如果由于某种原因出现网络拥塞怎么办?延迟可能会是100毫秒、200毫秒,甚至高达500毫秒。

回到我们上一个例子,你的客户端向服务器发送了一个输入:我按下了右箭头,服务器在50毫秒后获得它,假设服务器处理请求并立即发回更新的状态。您的客户端在50毫秒后获得最新的游戏状态:你现在处于位置 (1, 0)。从你的角度来看,在你按下右箭头的 1/10 秒内没有发生任何事情,然后你的角色终于向右移动了一个方格,你的输入与输出的结果的显示延迟看起来并不多,但它们是显而易见的。当然,如果你的延迟在半秒以上,你的游戏甚至会因为出现卡顿而无法继续进行下去。

总结

联网的多人游戏非常有趣,但它也引入了一系列全新的挑战。权威的服务器架构非常擅长阻止大多数的作弊,但其实现可能会使游戏中的操作产生延迟,并使玩家感到反应迟钝。

在下面的文章中,我们将探讨如何构建一个权威服务器的系统,同时最大限度的减少玩家所经历的操作延迟,使其几乎与本地单人游戏无任何区别。