Networking 网络游戏中的延迟处理

Networking 网络游戏中的延迟处理,networking,latency,dead-reckoning,Networking,Latency,Dead Reckoning,我正在考虑制作一个网络游戏。我对这一点有点陌生,并且已经遇到了很多问题,试图为航位推算和网络延迟制定一个好的计划,所以我希望看到一些关于这个主题的好文献。我将描述我考虑过的方法 最初,我只是将玩家的输入发送到服务器,在那里进行模拟,并向所有玩家广播游戏状态的变化。这使得作弊变得困难,但在高延迟情况下,事情有点难以控制,因为你不会立即看到自己行为的结果 有一个解决方案,通过在客户端上进行模拟,可以节省带宽并使本地输入看起来平滑,但它似乎将防作弊功能抛到了窗外。此外,我不知道当玩家开始操纵环境、推石

我正在考虑制作一个网络游戏。我对这一点有点陌生,并且已经遇到了很多问题,试图为航位推算和网络延迟制定一个好的计划,所以我希望看到一些关于这个主题的好文献。我将描述我考虑过的方法

最初,我只是将玩家的输入发送到服务器,在那里进行模拟,并向所有玩家广播游戏状态的变化。这使得作弊变得困难,但在高延迟情况下,事情有点难以控制,因为你不会立即看到自己行为的结果

有一个解决方案,通过在客户端上进行模拟,可以节省带宽并使本地输入看起来平滑,但它似乎将防作弊功能抛到了窗外。此外,我不知道当玩家开始操纵环境、推石头之类的东西时该怎么办。这些以前中立的对象将临时成为客户端需要发送PDU的对象,或者可能是多个玩家同时发送的对象。谁的PDU会赢?什么时候每个玩家会停止双重追踪这些物体(与推算的版本相比)?天堂禁止两名选手参加相扑比赛(例如,开始互相推搡)

显示了gamasutra解决方案的不足,但描述了一种不同的方法,它并不能真正修复我的协作推石示例。我发现的大多数其他东西都是针对枪手的。我希望看到一些更适合像斯内斯·塞尔达这样的游戏,但更多的物理/动力

  • 注意:这里我不是问物理模拟的问题——其他库也涉及到了这一点。尽管存在网络延迟,但这只是让游戏变得流畅和被动的策略

查看气门在源发动机中是如何工作的:


如果是第一人称射击游戏,你可能需要深入研究他们提到的一些主题,例如:预测、补偿和插值。

在XNA Creator's Club网站上查看网络教育主题。它深入研究了网络体系结构(对等或客户机/服务器)、网络预测和其他一些问题(当然是在XNA的上下文中)。这可能会帮助你找到你正在寻找的答案

我发现格伦·费德勒的作品,甚至下面的回应/讨论都很棒。这相当长,但值得一试

总之 当在现代游戏物理模拟(即车辆或刚体动力学)中收到客户端输入时,服务器无法跟上重复模拟的步伐。因此,服务器在服务器之前命令所有客户端延迟+抖动(时间),以便在服务器需要它们之前,所有输入数据包都以JIT方式到达

他还概述了如何处理您所要求的所有权类型。他在GDC上展示的幻灯片太棒了

论欺骗 费德勒先生本人(和其他人)表示,这种算法不太防作弊。事实并非如此。与传统的客户机/服务器预测相比,该算法的易用性和难用性都不亚于后者(请参阅中有关传统客户机/服务器预测的文章)

非常清楚:服务器不容易欺骗,因为它及时接收到网络物理定位(而不是像传统预测那样晚x毫秒)。客户端根本不会受到影响,因为它们都会以与传统预测完全相同的延迟接收对手的位置信息

无论你选择哪种算法,如果你要发布一个主要的标题,你可能会想要添加欺骗保护。如果您是,我建议添加加密(例如,“密钥流由伪随机数生成器生成”)和简单的健全性检查来防止裂缝。一些开发人员还实施算法来检查二进制文件是否完整(以降低破解风险)或确保用户没有运行调试器(以降低开发破解的风险),但这些算法更具争议


如果你只是在做一个小的独立游戏,可能只有几千人玩,那么在1)你需要它们之前,不要费心实现任何反作弊算法;或者2)用户群在增长。

您可以尝试对所有客户端施加延迟,具体取决于该区域的平均延迟。这样,客户机可以尝试解决延迟问题,大多数玩家都会有类似的感觉

当然,我并不是建议你对每个人都强制500毫秒的延迟,但是50毫秒的人只需要150秒(额外增加100毫秒)就可以了,这样游戏就更流畅了

简而言之;如果您有3名玩家:

  • 约翰:30毫秒
  • 保罗:150毫秒
  • 艾米:80毫秒
在计算之后,不是同时将数据发送回客户端,而是考虑它们的延迟,然后开始在John之前发送给Paul和Amy


但这种方法在极端的延迟情况下是不可行的,因为拨号连接或无线用户可能会给每个人都带来麻烦。但这是一个想法。

我们已经实现了一个基于强制服务器和远程玩家的多人蛇游戏,这些玩家可以进行预测。每150毫秒(大多数情况下),服务器会发回一条消息,其中包含每个远程玩家发送的所有合并动作。如果远程客户端移动延迟到达服务器,他将丢弃它们。客户端将重播最后一个动作。

我认为这是一个很好的建议。当然,这些材料需要一段时间才能消化,但非常值得一试。另一方面,我认为值得注意的是,该解决方案不太防作弊,事实上,我认为这与他们开发的合作游戏类型无关。他提到了这一点,但它的防作弊性(客户端/服务器)并不比传统的预测差,它只需要服务器重新执行