28

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

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

这篇 GamaSutra 文章有一个解决方案,可以通过在客户端上进行模拟来节省带宽并使本地输入看起来很流畅,但它似乎将防作弊功能扔到了窗外。此外,当玩家开始操纵环境、推动岩石等时,我不确定该怎么做。这些以前中立的对象将暂时成为客户端需要发送 PDU 的对象,或者可能是多个玩家同时发送的对象。谁的 PDU 会赢?每个玩家何时会停止对对象进行双重跟踪(与航位推算的版本进行比较)?天堂禁止两个玩家进行相扑比赛(例如开始互相推搡)。

这个 gamedev.net 位显示 gamasutra 解决方案不足,但描述了一种不同的方法,它并不能真正解决我的协作巨石推动示例。我发现的大多数其他东西都是针对射手的。我很想看到一些更适合像 SNES Zelda 这样玩的游戏,但涉及更多的物理/动力。

  • 注意:我不是在这里询问物理模拟——其他库已经涵盖了。尽管网络延迟,但只是使游戏流畅和反应灵敏的策略。
4

5 回答 5

21

查看 Valve 在 Source Engine 中是如何做到的:http: //developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

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

于 2008-09-03T20:48:14.780 回答
11

我发现Glenn Fiedler的这篇网络物理博客文章,更重要的是它下面的响应/讨论,太棒了。它很长,但值得。

总之

每当在现代游戏物理模拟(即车辆或刚体动力学)中接收到客户端输入时,服务器就无法跟上重复模拟的速度。因此,服务器在服务器之前订购所有客户端延迟+抖动(时间),以便所有传入的数据包在服务器需要它们之前进入 JIT。

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

关于作弊

Fiedler 先生本人(和其他人)表示,该算法的弊端在于不是很防作弊。这不是真的。该算法与传统的客户端/服务器预测一样容易或难以利用(请参阅@CD Sanchez 回答中有关传统客户端/服务器预测的文章)。

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

无论您选择哪种算法,如果您要发布主要游戏,都可能需要添加作弊保护。如果你是,我建议添加针对stooge bot的加密(例如XOR 流密码,其中“密钥流由伪随机数生成器生成”)和针对裂缝的简单完整性检查。一些开发人员还实施算法来检查二进制文件是否完整(以降低破解风险)或确保用户没有运行调试器(以降低开发破解的风险),但这些更值得商榷。

如果您只是制作一个较小的独立游戏,可能只有几千名玩家可以玩,请不要费心实施任何反作弊算法,直到 1)您需要它们;或 2) 用户群增长。

于 2009-05-07T15:23:40.747 回答
2

we have implemented a multiplayer snake game based on a mandatory server and remote players that make predictions. Every 150ms (in most cases) the server sends back a message containing all the consolidated movements sent by each remote player. If remote client movements arrive late to the server, he discards them. The client the will replay last movement.

于 2015-03-03T17:50:06.397 回答
0

在 XNA Creator's Club 网站上查看网络教育主题。它深入研究了诸如网络架构(点对点或客户端/服务器)、网络预测和其他一些内容(当然是在 XNA 的上下文中)等主题。这可以帮助您找到您正在寻找的答案。

http://creators.xna.com/education/catalog/?contenttype=0&devrea=19&sort=1

于 2008-09-16T16:48:22.967 回答
0

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

我当然不是建议你对每个人都强制延迟 500 毫秒,但有 50 毫秒的人可以使用 150 毫秒(额外增加 100 毫秒)以使游戏看起来更流畅。

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

  • 约翰:30 毫秒
  • 保罗:150毫秒
  • 艾米:80毫秒

计算后,您不会同时将数据全部发送回客户端,而是考虑它们的延迟,并在 John 之前开始发送给 Paul 和 Amy。

但是这种方法在拨号连接或无线用户可能真的把每个人都搞砸的极端延迟情况下是不可行的。但这是一个想法。

于 2009-05-07T15:32:39.587 回答