如何管理多人游戏中的网络延迟
网络延迟简介
服务器与客户端之间的距离、数据包跳数、服务器的 滴答和更新速率 以及其他许多问题都会导致多人游戏延迟——以下是解决方法。
在线游戏面临单人或局域网游戏不必担心的问题,例如抖动、往返时间(RTT)或数据包丢失。
任何在客户端和服务器之间发送、接收和排队信息的延迟都可能对游戏玩法造成问题。要查看完整的定义和问题列表,请查看本指南。
要成功解决延迟问题,您需要考虑以下元素之间的优先级和关系:
1.安防
2.反应性
3.准确性和一致性
没有解决方案是完美的,处理延迟问题的每种方法都有其优缺点。关键是找到最适合您游戏的方法,本指南将帮助您理解如何做出这个决定。
权威 定义了谁有权对客户端-服务器关系中的对象做出最终游戏决策。您选择的权限模型对您游戏中的网络延迟有影响。
在多人游戏中有两种权限类型,每种类型与安全性、反应性和一致性都有其自身的关系:
- 服务器权限:更安全,反应更少,没有同步问题。
- 客户权限:不太安全,更具反应性,可能存在同步问题。
任何存在于客户端的代码都可以被篡改,玩家可以伪造发送到服务器的虚假网络消息。
如果你想知道这在你的游戏中可能会是什么样子,可以考虑一个例子:在这个游戏中,你无法从某个距离杀死小鬼。
如果您在客户端逻辑中指定不能在10米以外杀死这些小鬼,但“杀死小鬼”的消息是一个不检查服务器端距离的服务器RPC,玩家可以伪造该网络消息以绕过您的客户端逻辑。
不幸的是,总会有人试图干扰你的游戏,因此你应该始终记住,你永远不能完全信任客户。为了那些可怜的小恶魔和所有其他玩你游戏的人,你的服务器需要逻辑来验证来自客户端的玩家行为。
权威模型和延迟
您选择的权限模型对您游戏中的网络延迟有影响。让我们回顾一下两种权威类型及其与安全性、反应性和一致性的关系。
一款服务器权威的游戏,其所有最终游戏决策均由服务器执行。
安全 ✅
关键数据,例如您的角色健康或位置,可以由服务器权威,以确保作弊者无法干扰。在那种情况下,服务器将对该数据的值拥有最终决定权。
一致性 ✅
服务器权威游戏的一个优势是您世界的一致性。由于所有游戏决策都是由网络上的同一个节点(服务器)做出的,因此您可以确保这些决策是在同一时间做出的。
反应性 🚫
服务器权限的问题在于你最终会等待服务器告诉你更新你的世界。然而,请继续关注,因为您可以使用一些模式来解决此问题,同时仍然保持服务器的权威性。
在一个客户端权威的游戏中,你仍然有一个用于共享世界状态的服务器,但客户端将拥有并强加他们自己的现实。
反应性 ✅
当您信任您的用户或他们的设备时,客户端授权模型通常可以使用,并且它是反应性的有用模型。由于客户端本身正在做出所有重要的游戏决策,因此它可以在用户输入发生时立即显示结果。
一致性 🚫
客户端权威游戏可能会遇到同步问题。如果您让客户使用过时的信息做出权威决策,您将遇到不同步、重叠的物理对象以及其他此类问题。
安全 🚫
客户端权限在您的服务器上是一个相当危险的门,因为任何恶意玩家都可以伪造消息以赢得游戏。
在服务器主导的游戏中解决延迟问题
多玩家开发的最佳实践是采用服务器主导模型,以确保一致性和安全性。让我们讨论四个关键策略来管理这些游戏中的延迟。
在设计您的功能时,默认使用服务器权限,然后识别哪些功能需要响应性,并且对安全性或世界一致性没有重大影响。
用户输入是一个很好的例子。由于用户已经拥有他们的输入(我拥有我的按键,服务器不能告诉我“你没有按下W键”),用户输入数据可以很容易地由客户端驱动。
在第一人称射击游戏中,您的视角方向可以轻松地由客户端驱动,而不会产生太大影响。客户端将发送其视线方向而不是鼠标移动到服务器。在你查看的地方进行更正会感觉很奇怪,而这方面的安全性也有其自身的挑战。
预测可以保持您的游戏服务器权威,同时保持反应灵敏。您的客户端模拟并运行游戏代码,预期玩家的触发输入,而不是等待完整的往返时间(RTT)以获取行动结果。
这就是“调解”发挥作用的地方——当预测中出现错误时。客户端保留其预测位置的历史记录,并且由于服务器具有权威性,客户端仍然接收来自服务器的位置。客户将验证其过去预测的位置是否与来自服务器的旧位置相符。
客户端可以检测到差异,并根据服务器的权威位置来纠正其位置。
注意此方法目前不完全受Netcode for GameObjects支持。
有多个原因导致服务器权威的游戏代码不能同时在客户端(带有预测)和服务器端运行。但是你如何确保投掷感觉灵敏,并且你的客户端不必等待完整的往返时间(RTT)才能看到任何对他们输入的反应?
一种常用于隐藏延迟的技巧是,在玩家输入时立即触发一个不影响游戏玩法的动画、声音或视觉特效,但仍然等待服务器授权的游戏元素来推动其余的动作。
如果服务器有不同的状态,客户端最糟糕的情况就是你播放了一个快速但无用的动画。很容易就让动画完成或取消它。这被称为动作投射或动作预期。
服务器回滚是对客户端驱动功能的安全检查,以确保我们保持服务器的权威性。
客户在其输入中发送一条消息告诉服务器:"我在时间t达到了我的目标"。服务器在时间 t+RTT/2 接收到此信息时,将在时间 t-RTT 回滚其模拟,验证射击并在最晚时间(即击杀目标)纠正世界。这使得玩家能够感受到世界的一致性,同时仍然保持安全和服务器的权威性。
注意:游戏状态的服务器回放是在同一帧中完成的,这对玩家是不可见的。这是一个服务器端检查,允许验证客户端告诉您该做什么。
注意此方法目前不完全受Netcode for GameObjects支持。
构建一款多人游戏是一项具有挑战性的工作,但也是一项令人兴奋的工作。无论您是在打造下一个战斗 royale 热门游戏,还是一个舒适的在线合作游戏,理解延迟的细微差别以及如何管理它都是至关重要的。
查看我们的多人游戏文档,今天就开始您的下一个项目。