[介绍]
这是探索使快节奏多人游戏成为可能的技术和算法的系列文章中的第一篇。如果您熟悉多人游戏背后的概念,则可以放心地跳到下一篇文章 – 以下是介绍性讨论。
开发任何类型的游戏本身都具有挑战性;然而,多人游戏增加了一系列需要处理的全新问题。有趣的是,核心问题是人性和物理学!
[作弊的问题]
这一切都始于作弊。
作为游戏开发者,您通常不会关心玩家是否在您的单人游戏中作弊 - 他们的行为不会影响除了他以外的任何人。作弊的玩家可能不会完全按照您的计划体验游戏,但既然这是他们的游戏,他们有权以他们喜欢的任何方式玩。
不过,多人游戏是不同的。在任何竞技游戏中,作弊玩家不仅会让自己的体验变得更好,还会让其他玩家的体验变得更糟。作为开发人员,您可能希望避免这种情况,因为它往往会让玩家远离您的游戏。
有很多事情可以防止作弊,但最重要的(可能是唯一真正有意义的)很简单: 不要相信玩家 。始终假设最坏的情况 - 玩家 会 试图作弊。
[权威服务器和哑客户端]
这导致了一个看似简单的解决方案 – 您将游戏中的所有内容都发生在您控制的中央服务器中,并使客户端成为游戏的特权观众。换句话说,您的游戏客户端将输入(按键、命令)发送到服务器,服务器运行游戏,您将结果发送回客户端。这通常被称为使用 权威服务器 ,因为关于世界上发生的一切的唯一权威是服务器。
当然,您的服务器可以被利用来获取漏洞,但这超出了本系列文章的范围。不过,使用权威服务器确实可以防止各种黑客攻击。例如,您不信任客户端了解玩家的运行状况;被黑客入侵的客户端可以修改该值的本地副本,并告诉玩家它有 10000% 的生命值,但服务器 知道 它只有 10% 的生命值——当玩家受到攻击时,它会死亡,无论被黑客入侵的客户端怎么想。
您也不信任玩家在世界中的位置。如果你这样做了,被黑客入侵的客户端会告诉服务器“ 我在 (10,10) ”,一秒钟后“ 我在 (20,10) ”,可能会穿过墙壁或比其他玩家移动得更快。相反,服务器 知道 玩家在 (10,10),客户端告诉服务器“ 我想向右移动一个方格 ”,服务器用新的 (11,10) 位置更新其内部状态,然后回复玩家“ 你在 (11,10) ”:
简单的客户端-服务器交互。
总之:游戏状态由服务器单独管理。客户端将其操作发送到服务器。服务器定期更新游戏状态,然后将新的游戏状态发送回客户端,客户端只是在屏幕上呈现它。
[处理网络]
哑客户端方案适用于基于慢回合的游戏,例如策略游戏或扑克。它也可以在 LAN 环境中工作,其中通信在所有实际目的下都是即时的。但是,当用于通过网络(如 Internet)进行的快节奏游戏时,这会失效。
让我们谈谈物理学。假设您在旧金山,连接到纽约的服务器。这大约是 4,000 公里,或 2,500 英里(这大约是里斯本和莫斯科之间的距离)。没有什么比光传播得更快了,甚至互联网上的字节也不例外(在较低层次上是光脉冲、电缆中的电子或电磁波)。光的传播速度约为 300,000 公里/秒,因此传播 4,000 公里需要 13 毫秒。
这听起来可能很快,但实际上是一个非常乐观的设置——它假设数据以光速在直线路径上传播,但很可能不是这样。在现实生活中,数据会从一个路由器到另一个路由器经历一系列的跳转(在网络术语中称为 跳转 ),其中大多数并不是以光速完成的;路由器本身会引入一些延迟,因为数据包必须被复制、检查和重新路由。
为了便于论证,我们假设数据从客户端到服务器需要 50 毫秒。这接近最好的情况 – 如果您在纽约连接到东京的服务器,会发生什么情况?如果由于某种原因出现网络拥塞怎么办?100、200 甚至 500 毫秒的延迟并非闻所未闻。
回到我们的示例,您的客户端向服务器发送一些输入(“ I pressed the right arrow ”)。服务器在 50 毫秒后获取它。假设服务器处理请求并立即发回更新的状态。您的客户端在 50 毫秒后获得新的游戏状态(“ 您现在位于 (1, 0) ”)。
从你的角度来看,发生的事情是你按下了向右箭头,但在十分之一秒内什么都没有发生;然后你的角色终于向右移动了一个方格。您的输入与其后果之间的这种感知 延迟 听起来可能不多,但它很明显——当然,半秒的延迟不仅很明显,它实际上使游戏无法玩。
[总结]
联网多人游戏非常有趣,但引入了一类全新的挑战。权威服务器架构在阻止大多数作弊方面非常出色,但简单的实现可能会使游戏对玩家反应迟钝。
在下面的文章中,我们将探讨如何构建基于权威服务器的系统,同时最大限度地减少玩家所经历的延迟,使其与本地或单人游戏几乎没有区别。
