你是一个喜欢玩游戏的人吗?尤其是多人联机?你有没有想过多人游戏如何在游戏服务器的帮助下工作?让我们从一些见解开始。在大多数情况下,现代在线游戏使用客户端-服务器模型。在简单的客户端-服务器范例中,玩家传输输入,例如,点击服务器、鼠标移动和按键。该服务器更新在游戏世界中你的性格和与合计携带你的性格和其他玩家作为响应的更新状态恢复的状态。
多人游戏简史
在游戏历史的开始,游戏是点对点的网络,多台计算机在一个完全组合的网状拓扑结构中相互交易信息。这些类型的游戏模型仍然存在于 RTS 游戏中,并且出于某种目的很有趣。因为这是第一种方式——这可能是大多数人认为游戏网络运作的方式。在下一阶段的动作游戏中,点对点锁步的限制在《毁灭战士》中越来越明显,尽管在局域网上玩得很好,但对于普通用户来说,互联网上的表现却很糟糕。
后来,为了领先于 LAN,例如连接良好的大学网络或大型组织,开发模型是必不可少的。这就是客户端-服务器模型发布并取代了一些现有的点对点游戏系统的时候。1996 年,这正是 John Carmack 和他的合作伙伴在发布采用客户端/服务器而不是点对点的 Quake 时所做的。
现在代替每个玩家运行相同的游戏代码并直接相互交互,每个玩家现在都是一个“客户端”,他们都只与一个称为“服务器”的网络进行通信。游戏不再需要在所有设备上都具有确定性,因为游戏实际上是在服务器上。每个客户端都作为一个哑终端有效地工作,显示游戏在服务器上进行时的估计。这是一个很好的行动。游戏实践的本质现在取决于客户端和服务器之间的相关性,而不是游戏中的延迟对等点。玩家在游戏中途暂停和恢复也变得可以容忍,并且随着客户端/服务器降低每个玩家平均所需的带宽,玩家数量增加。接下来发生的事情将永远改变这个行业。以前,问题当然是延迟。后来,开发人员清除并继续使一切正常工作。
客户端预测
在最初的 Quake 中,您经历了计算机和服务器之间的延迟。例如,按向前,您将等待数据包传输到服务器并返回给您所需的时间,然后才能真正开始;在另一种情况下,按开火并等待相同的延迟,然后再进行射击。如果您尝试过任何现代 FPS,例如“使命召唤”、“现代战争”,您会觉得体验更好,没有延迟。因此,为了消除延迟,客户端很快就会处理比以前更多的代码。它不是向服务器提供输入并在发回的状态之间插入的哑终端。相反,它能够根据您的输入,在客户端机器上为您的玩家角色操作游戏代码的子集,从而部分地和快速地预测您的角色的演变。现在,只要您向前推进,客户端和服务器之间的往返就没有停顿——您的角色立即开始向前移动。
多人游戏服务器架构
服务器将具有“垂直扫描速率”,即它频繁更新玩家信息的速率。最好是匆忙,因为在游戏中每一刻都很重要。通常,需要多次滴答才能为用户提供实时体验。打勾表示信息每秒更新的次数。在每个刻度上,客户端可能会向游戏世界发送玩家的动作、攻击或任何变化。服务器上运行着一个权威版本的世界。但是使用了各种方法来确保消费者在采取行动之前不会期待另一端。
可能存在确定性动作和非确定性动作。在确定性动作中,服务器可以根据原始数据预测对象的未来状态。例如,要给出枪声事件,服务器只需要了解一些主要信息,例如方向和力量。根据此信息,服务器可以指导客户端如何完成播放。在非确定性回复中,服务器无法预测未来的事件。因此,客户端希望向服务器发送一致的数据流。获得输入数据,执行模拟后,服务器传输包含所有客户端点的正式版本的容器。
模拟代码使用这些数据流,影响运动并将它们固定到特定的图形位置。这种模拟可以在服务器和消费者上运行。从编程方面来说,我们想要处理延迟问题。同时需要消息来报告,事情也就过去了。服务器和消费者都必须玩弄时间来处理延迟。
为了在按键后为玩家提供即时反馈,客户端可以预测服务器在获得玩家输入后的工作情况并很快执行此操作。然后客户端将其新位置报告给服务器。为了预测精确的状态变化,客户端还必须影响游戏环境。但是,由于延迟,客户端和服务器可能会变得不合适。服务端可能会频繁的通知客户端此时需要进行改进,这会出现在玩家无法操作的动作中。
为了补偿同步问题,一个计划是让服务器允许在它认为玩家的状态应该是什么和玩家报告的状态之间有一定数量的变化。一旦附加上,管理本地玩家的位置变化会很快导致游戏更加稳定。 每个客户端机器都会向服务器传输一个恒定的数据包流,其中每个数据包都包含对玩家输入的简单更新。每个刻度,客户端可能会指定鼠标位置或按下的键。这是带宽不足的流。
模拟代码使用这些输入流,模拟运动并将它们固定到角色位置。这种模拟可以在服务器和客户端上运行。服务器在接收到相关输入时授予数据包,将使用传输模拟游戏位置。在大多数情况下,这将与客户的假设准确匹配。这些客户位置仅与移动对象进行比较。所有不变的对象永远不会更新。