如何管理多人游戏中的网络延迟

了解多人游戏中网络延迟的基础知识,并了解应对策略。

网络延迟简介

服务器和客户端之间的距离、数据包跃点数、服务器的节拍率和更新速率,以及很多其他因素会导致多人游戏延迟,下文介绍如何应对此类问题。 

什么是网络延迟?

网络游戏会出现单人游戏或仅限 LAN 的游戏中不存在的问题,例如抖动、往返时间 (RTT) 或丢包。

客户端和服务器之间发送、接收信息和排列信息队列而导致的任何形式的延迟都会造成游戏出现问题。有关定义和问题的完整列表,请参阅此处的本指南

要想成功解决延迟问题,您需要考虑以下因素的优先级和关系:

  1. 安全性
  2. 反应能力
  3. 准确性和一致性

没有任何解决方案是完美的,延迟问题的每一种处理方式都各有优势和劣势。关键是找到适合您游戏的方式,本指南将帮助您了解如何做出明智决策。

授权

授权定义了谁有权对客户端-服务器关系中的对象做出最终游戏决定。您选择的授权模式对游戏中的网络延迟有影响。 

在多人游戏中,有两种授权类型,每种类型都有特定的安全性、反应能力和一致性:

  • 服务器授权:更安全,反应能力较弱,没有同步问题。
  • 客户端授权:安全性较低,反应能力较强,可能存在同步问题。

存在于客户端的任何代码都可能遭到篡改,玩家可以伪造虚假网络消息发送给服务器。

这些因素如何影响实际游戏?

如果您想知道这些因素对游戏有何影响,不妨考虑您在一定距离外无法杀死小怪物的游戏示例。

如果您在客户端逻辑中规定,玩家不能在超过 10 米的地方杀死小怪物,但“杀死小怪物”消息属于服务器 RPC,其不会检查服务器端的距离,玩家可以伪造此网络消息,以绕过客户端逻辑。

遗憾的是,总是有人会试图扰乱游戏,所以您应该始终牢记,永远不能完全信任客户端。为了维护游戏秩序并保护所有其他玩家的游戏体验,您的服务器需要逻辑来验证玩家行为是否真的来自客户端。

授权模式和延迟

您选择的授权模式对游戏中的网络延迟有影响。我们一起来看看这两种授权类型,以及每种类型的特定安全性、反应能力和一致性。

服务器授权游戏

服务器授权游戏

服务器授权游戏的所有最终游戏决定都由服务器执行。

安全性 ✅

关键数据(如角色生命值或位置)可设置为服务器授权,以确保作弊者无法破坏这些数据。在这种情况下,服务器将有权最终决定相应数据的值。

一致性 ✅

服务器授权游戏的一个优势是您游戏世界的一致性。由于所有的游戏决定都由网络上的同一个节点(服务器)做出,您可以确保这些决定在同一时间做出。

反应能力 

服务器授权模式的一个问题是,您需要等服务器通知您更新游戏世界。然而,请继续关注这个问题,您可以借助一些模式来解决这个问题,同时仍保持服务器授权模式。

客户端授权游戏

客户端授权游戏

在客户端授权游戏中,您仍拥有用于共享世界状态的服务器,但客户端将拥有并实施自己的现实。

反应能力 ✅

当您信任您的用户或其设备时,通常可以使用客户端授权模式,它在反应能力方面有较大优势。由于客户端本身负责做出所有重要的游戏决定,它可以在用户输入完成后立即显示结果。

一致性 

客户端授权游戏可能会遇到同步问题。如果您让客户端使用过时的信息做出权威决定,则会遇到不同步、物理对象重叠和其他类似问题。

安全性 

客户端授权模式可能导致服务器面临较大风险,因为任何恶意玩家都可通过伪造消息来赢得游戏。

解决服务器授权游戏中的延迟问题

多人游戏开发的最佳实践是采用服务器授权模式,以保证一致性和安全性。下面我们介绍管理这类游戏延迟的四个关键策略。

1.允许低影响的客户端授权

在设计游戏功能时,将服务器授权作为默认模式,然后确定哪些功能需要反应能力,且对安全性或世界一致性没有太大的影响。

用户输入就是一个很好的例子。由于用户已经拥有输入(我拥有自己的按键,服务器不能告诉我“不,您尚未按下 W 键”),用户输入数据可以很容易地由客户端驱动。

在 FPS 游戏中,玩家的观察方向可以很容易地由客户端驱动而不产生太大的影响。客户端将向服务器发送其观察方向而不是鼠标移动动作。对您的观察方向进行校正会感觉很奇怪,而且此类调整将导致安全性也面临一定风险。

2.客户端预测

预测可以保持您的游戏采用服务器授权模式,同时保持较好反应能力。您的客户端模拟并运行游戏代码,预测玩家的触发输入,而不是等待完整 RTT,以获得行动结果。

当预测中出现错误时,“调节”就会开始发挥作用。客户端会保留其所预测的位置的历史记录,在采用服务器授权模式时,客户端仍然会接收来自服务器的位置。客户端将验证其在过去预测的位置是否与来自服务器的旧位置相符。

然后,客户端可检测二者差异,并根据服务器的权威位置来纠正其位置。

注意:目前 Netcode for GameObjects 尚未完全支持这种方法。

3.动作预测

之所以不允许服务器授权的游戏代码同时在客户端(启用预测)和服务器端运行,有多种原因。您如何确保抛出动作反应灵敏,而且客户端不必等待一整个 RTT 就能看到针对其输入的反应?

一个经常用于隐藏延迟的技巧,是在玩家输入时立即触发不影响游戏的动画、声音或 VFX,但仍然等待服务器授权的游戏元素来驱动其余的动作。

如果服务器有不同的状态,客户端发生最坏的情况是您播放了简短而无用的动画。玩家可以轻松完成或取消动画播放。这称为动作投射或动作预测。

4.服务器端倒退(又称为“延迟补偿”)

服务器倒退是对由客户端驱动的功能的安全检查,以确保处于服务器授权模式。

客户端随用户输入发送一条消息,告诉服务器“我在时间 t 击中了目标”。服务器在时间 t+RTT/2 收到这个信息时,会倒退回时间 t-RTT 时的模拟情况,验证射击,纠正最晚时间的世界(即击杀目标)。这让玩家感到世界是一致的,同时仍确保安全性并保持服务器授权模式。

注意:服务器对游戏状态的倒退都是在同一帧中完成的,玩家几乎不会察觉。这是一项服务器端的检查,可以验证告诉您如何采取行动的客户端。

注意:目前 Netcode for GameObjects 尚未完全支持这种方法。

结论

构建多人游戏是一项具有挑战性的工作,但同样令人兴奋。无论您要构建下一个热门大逃杀游戏,还是要打造风格轻松的在线协作游戏,了解延迟的细微差别以及如何管理延迟至关重要。

查看我们的多人游戏文档,立刻开始打造您的下一个项目。

浏览文档

我们使用 Cookie 来确保为您提供网站的最佳体验。有关更多信息,请访问我们的 Cookie 政策页面

明白了